如何使用perl解析具有属性的XML标记

时间:2015-12-30 07:10:33

标签: xml perl parsing foreach

下面是一个XML文件,

   <?xml version='1.0'?>
    <employee>
      <name>Pradeep</name>
      <age>23</age>
      <sex>M</sex>
      <department>Coder</department>
    </employee>

perl代码是

 use XML::Simple;
 use Data::Dumper;
 @xml=new XML::Simple;
 $data=@xml->XMLin("data.xml");
 print Dumper($data);

现在,如果XML文件是

,你如何解析
   <?xml version='1.0'?>
      <employee="risc_31">
       <name>John Doe</name>
       <age>43</age>
       <sex>M</sex>
       <department>Analyst</department>
      </employee>
      <employee="risc_32">
       <name>Pradeep</name>
       <age>23</age>
       <sex>M</sex>
       <department>HR</department>
      </employee>

如何使用perl

中的foreach循环来完成

注意:XML :: Simple对我来说更容易

感谢任何帮助!

2 个答案:

答案 0 :(得分:2)

您的xml无效,您无法

<employee="risc_31">

您可以拥有类似

的内容
<employee employeeId="risc_31">

假设你的xml是

<?xml version='1.0'?>
<employee employeeId="risc_31">
  <name>John Doe</name>
  <age>43</age>
  <sex>M</sex>
  <department>Analyst</department>
</employee>
<employee employeeId="risc_32">
  <name>Pradeep</name>
  <age>23</age>
  <sex>M</sex>
  <department>HR</department>
</employee>

您可以使用libXML执行以下操作(抱歉,我不知道XML :: Simple)

use strict;
use XML::LibXML;

my $filename = 'data.xml';
my $parser = XML::LibXML->new();
my $xmldoc = $parser -> parse_file( $filename );

foreach my $employee( $xmldoc -> findnodes( '/employee' ) ) {
  my $employeeId = $employee -> getAttribute( 'employeeId' );

  my $name = $employee -> findnodes( './name' );
  my $age = $employee -> findnodes( './age' );
  my $sex = $employee -> findnodes( './sex' );
  my $department = $employee -> findnodes( './department' );

}

exit 0;

答案 1 :(得分:0)

XML和Perl的问题。看一下Mac上的xmllint,我假设linux ......

将XML视为具有两种类型的数据......&#34;数据&#34;和#34;元数据&#34;,匹配的&#34;&gt; ME ME ME&lt;&#34;是真实数据,匹配之间的所有内容&lt;&#34; me&#34; &#34;我&#34; &#34;我&#34;&GT;是元数据。混合它们意味着你会遇到错误,即xmllint向我展示了这个

data.xml:2: parser error : error parsing attribute name
<employee="risc_31">
     ^
data.xml:2: parser error : attributes construct error
<employee="risc_31">
     ^
data.xml:2: parser error : Couldn't find end of Start Tag employee line 2
<employee="risc_31">
     ^
data.xml:2: parser error : Extra content at the end of the document
<employee="risc_31">
     ^

将XML更改为更像。注意我已经添加了一个&#34; wtf&#34;进入这个记录,即我已经做了#34; risc_nn&#34;数据作为员工记录的真实部分,而非元数据......

<?xml version="1.0"?>
<foo>
<employee>
  <wtf>risc_31</wtf>
  <name>John Doe</name>
  <age>43</age>
  <sex>M</sex>
  <department>Analyst</department>
</employee>
<employee>
  <wtf>risc_32</wtf>
  <name>Pradeep</name>
  <age>23</age>
  <sex>M</sex>
  <department>HR</department>
  </employee>
</foo>

以下Perl程序现在可以使用

use strict;
use warnings;
use XML::Simple;
use Data::Dumper;
my @xml=new XML::Simple;
my $data=XMLin("data.xml");
print Dumper($data);

并提供以下结果......

$VAR1 = { 
    'employee' => {
        'John Doe' => {
            'wtf' => 'risc_31',
            'sex' => 'M',
            'department' => 'Analyst',
            'age' => '43'
     },  
     'Pradeep' => {
            'age' => '23',
            'wtf' => 'risc_32',
            'sex' => 'M',
            'department' => 'HR'
     }   
  }   
};

如果你想循环它是一个哈希引用,那么使用以下...

for my $key (%{$data}) {
  print $data->{$key} . "\n";
}

或者在Perl中做任何事情的无数方法。