从XML标记

时间:2016-10-18 18:42:41

标签: xml perl

我正在尝试从此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];

知道为什么这不起作用吗?

2 个答案:

答案 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::LibXMLXML::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