下面是一个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对我来说更容易
感谢任何帮助!
答案 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中做任何事情的无数方法。