2016-04-05 3 views
0

XML-Datei erwartet:Der Versuch, eine XML-Datei in Perl mit XML :: Simple zu analysieren. Aber ich immer bin nicht Ergebnis

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE companies> 
<companies> 
<company> 
<ticker>IBN</ticker> 
<title>ICICI Bank Ltd</title> 
<address>ICICI Bank Ltd.ICICI Bank TowersBandra-kurla Complex, Mumbai</address> 
<phonenum> 91 22 2653 6157</phonenum> 
<faxnum> 91 22 2653 1175</faxnum> 
<full_time> </full_time> 
<website>http://www.icicibank.com</website> 
<sector>Financial</sector> 
<industry>Foreign Regional Banks</industry> 
<news>Headlines Financial Blogs Company Events Message Board</news> 
<sno>0</sno> 
<fin_ticker>IBN</fin_ticker> 
<marketcap>24.52B</marketcap> 
<e_value>24.52B</e_value> 
<ret_on_assets>0.74%</ret_on_assets> 
<gross_profit>8.94B</gross_profit> 
<prof_margin>10.79%</prof_margin> 
<last_trade>44.05</last_trade> 
<trade_time>Apr 8</trade_time> 
<prev_close>44.52</prev_close> 
<serialno>0</serialno> 
<mgt_ticker>IBN</mgt_ticker> 
</company> 
<company> ... </company> 
<company> ... </company> 
<company> ... </company> 
<company> ... </company> 
</companies> 

Perl-Code:

use strict; 
use warnings; 
use XML::Simple; 
use Data::Dumper; 

my $xmlfile = "sample1.xml"; 
my $xml = new XML::Simple; 
my $data = $xml->XMLin($xmlfile); 

#print Dumper($data); 
print "$data->{company}{title}\n"; 

Erwartete Ausgabe: ICICI Bank Ltd

+0

Wenn Sie‚XML-Datei: IBN ICICI Bank Ltd ...‘sagen, sagen Sie sind diejenigen, die Inhalt der Datei, die Sie analysieren möchten? Das ist definitiv keine gültige XML-Syntax. XML ist strukturierte Daten mit vielen '<' and '>' Zeichen. Siehe Beispiel [hier] (https://msdn.microsoft.com/en-us/library/ms762271 (v = vs.85) .aspx). – sferencik

+0

@sferencik die Formatierung war kaputt, es gab eine leere Zeile fehlt. Ich habe es repariert. Fühlen Sie sich frei, einen Änderungsvorschlag zu senden, wenn Sie das nächste Mal sehen. :) – simbabque

+0

Was sagt Ihr Data :: Dumper Ausgang? Es sieht so aus als ob du die '' in deinem 'print' vermisst. – simbabque

Antwort

1

Bitte don't use XML::Simple. Es liegt - es ist überhaupt nicht einfach.

Ich mag XML::Twig als Alternative:

use XML::Twig; 
print $_ -> text,"\n" for XML::Twig -> parsefile ('sample1.xml') -> get_xpath('//company/title'); 

den Trick tun.

es aus Gründen der Klarheit Erweiterung:

#!/usr/bin/env perl 
use strict; 
use warnings; 

use XML::Twig; 

my $twig = XML::Twig -> parsefile ('sample1.xml'); 

foreach my $company ($twig -> get_xpath('//company')) { 
    print $company -> first_child('title') -> text,"\n"; 
} 

Einer der wichtigsten Vorteile von XML::Twig und XML::LibXML ist, dass sie xpath unterstützen - was für XML Art wie ein regulärer Ausdruck ist.

Aber es bedeutet, dass Sie Ihr Unternehmen Titel durch die Angabe zur Auswahl:

//company/title 
/companies/company/title 

// eine Wild Card ist ‚irgendwo im Dokument‘. Sie können tun .// auch für ‚überall unterhalb dieses Elements, so etwas wie:

print $company -> get_xpath('.//title',0)->text,"\n" 

usw.

+1

XML :: Zweigregeln !!! –

1

XML :: Simple

Status dieser MODUL

Die Verwendung dieses Moduls in neuen Code wird abgeraten.

Insbesondere ist XML::LibXML sehr zu empfehlen und XML::Twig ist eine ausgezeichnete Alternative.

http://search.cpan.org/~grantm/XML-Simple-2.22/lib/XML/Simple.pm


In jedem Fall ist das Problem mit Ihrem XML::Simple Versuch:

$data->{company}{title} 

ist, dass $data->{company} gibt ein Array-Referenz:

use strict; 
use warnings; 
use 5.020; 
use XML::Simple; 
use Data::Dumper; 

my $xmlfile = 'xml.xml'; 
my $href = XMLin($xmlfile); 
say Dumper($href); 

--output:-- 
$VAR1 = { 
      'company' => [ #<== That means array reference! 
         { 
         'industry' => 'Foreign Regional Banks', 
         'phonenum' => ' 91 22 2653 6157', 
         'trade_time' => 'Apr 8', 
         'ret_on_assets' => '0.74%', 
         'faxnum' => ' 91 22 2653 1175', 
         'website' => 'http://www.icicibank.com', 
         'serialno' => '0', 
         'mgt_ticker' => 'IBN', 
         'title' => 'ICICI Bank Ltd', 

       ... 
       ... 

und Sie können keine Arrays zugreifen mit {...}, wie du es getan hast:

 array 
     | 
+--------------+     
|    | 
$data->{company}{title} 

Stattdessen müssen Sie Arrays Zugriff mit [...]. Das erste Element des Arrays ist die Hash-Referenz, so dass der Hash ist bei Index 0 im Array:

 hash 
     | 
+-----------------+     
|     | 
$data->{company}[0] 

Jetzt können Sie Hash-Zugriff {...} auf diesem Hash verwenden, um die title zu erhalten:

 hash 
     | 
+-----------------+     
|     | 
$data->{company}[0]{title} 


use strict; 
use warnings; 
use 5.020; 
use XML::Simple; 
use Data::Dumper; 

my $xmlfile = 'xml.xml'; 
my $href = XMLin($xmlfile); 
say "$href->{company}[0]{title}"; 

--output:-- 
ICICI Bank Ltd 

Hier ist es mit XML::LibXML:

1) Using DOM methods:

use strict; 
use warnings; 
use 5.020; 
use XML::LibXML; 
use Data::Dumper; 

my $xmlfile = "xml.xml"; 
my $parser = XML::LibXML->new(); 
my $doc = $parser->parse_file($xmlfile); 
#say $doc; #outputs the xml 

my $root = $doc->getDocumentElement; #=> <companies> tag 
my @company_tags = $root->getElementsByTagName('company'); 
my @title_tags = $company_tags[0]->getElementsByTagName('title'); 
say $title_tags[0]->textContent(); 

--output:-- 
ICICI Bank Ltd 

2) Using XPaths:

use strict; 
use warnings; 
use 5.020; 
use XML::LibXML; 
use Data::Dumper; 

my $xmlfile = "xml.xml"; 
my $parser = XML::LibXML->new(); 
my $doc = $parser->parse_file($xmlfile); 
#say $doc; #outputs the xml 

my $root = $doc->getDocumentElement; #=> <companies> tag 
my @titles = $root->findnodes("//company/title"); 
say $titles[0]->findnodes("./text()"); 

--output:-- 
ICICI Bank Ltd 

Die Methoden:

  1. findnodes()
  2. find()
  3. findvalue()

in den XML::LibXML docs finden here.

+0

http://stackoverflow.com/questions/33267765/why-is-xmlsimple-discouraged – Sobrique

+0

@toolic, Wie wäre es jetzt? – 7stud

Verwandte Themen