我正在尝试从此xml文件中提取值,但似乎无法实现...
<?xml version="1.0" encoding="UTF-8"?>
<personReport xmlns="...">
<header>
<creation>2016-10-15</creation>
</header>
<details>
...
</details>
<person id="person1">
<personId personIdScheme="name of">joe</personId>
</person>
<person id="person2">
<personId personIdScheme="name of">sam</personId>
</person>
</personReport>
我成功地使用以下方法从其他标签(例如标题)中提取数据:
my $xml = XMLin($xml_file);
my $header = $xml->{header}
->{creation};
我正在尝试做同样的事情,但从<person>
获取数据(乔)......
my $person_type = $xml->{personReport}
->{person1}[1];
知道为什么这不起作用吗?
答案 0 :(得分:1)
$xml->{personReport}{person1}[1]
应该是
$xml->{person}{person1}{personId}{content}
如果你不明白为什么,也许你不应该使用一个模块complex,作者不鼓励使用它。
本模块的状态
不鼓励在新代码中使用此模块。其他模块可用,提供更直接和一致的接口。特别是,强烈建议使用XML :: LibXML,XML :: Twig是一个很好的选择。
使用XML :: Simple查找每个人的姓名:
# Assumes each person element will have at least one personId child.
# Assumes each personId element will have a personIdScheme attribute.
for my $person (values(%{ $xml->{person} })) {
my @data_nodes ref($person->{personIdScheme}) eq 'ARRAY'
? @{ $person->{personIdScheme} }
: $person->{personIdScheme};
my ($name_data_node) = grep { $_->{personIdScheme} eq 'name' } @data_nodes;
my $name = $name_data_node->{content};
...
}
使用XML :: LibXML查找每个人的姓名:
for my $person_node ($doc->findnodes('/personReport/person')) {
my $name = $doc->findvalue('personId[@personIdScheme="name of"]', $person_node);
...
}
答案 1 :(得分:1)
几乎任何XML模块都优于XML::Simple
,这只是简单的使用
XML::LibXML
和XML::Twig
非常受欢迎,并且都允许您使用XPath表达式来处理XML文档。这是使用XML::Twig
use strict;
use warnings 'all';
use feature 'say';
use XML::Twig;
my $twig = XML::Twig->new;
$twig->parsefile( 'personReport.xml' );
say $twig->findvalue('/personReport/header/creation');
for my $person ($twig->findnodes('/personReport/person') ) {
my $id = $person->att('id');
my $name = $person->findvalue('personId[@personIdScheme="name of"]');
say "$id $name";
}
2016-10-15
person1 joe
person2 sam