返回数组中具有相同名称的两个标记的值

时间:2016-04-25 10:14:52

标签: xml perl xml-libxml

我的XML:

<?xml version="1.0" encoding="UTF-8" ?>
<CONFIG>
  <item>
    <phone>1234578</phone>
    <phone>876543321</phone>
   </item>
</CONFIG>  

我需要在包含2个元素的数组中获取这两个数字。

我的Perl代码:

my $xmlDoc = XML::LibXML->new->parse_file($config_file);
$Xpath = XML::LibXML::XPathContext->new($xmlDoc);

my @item = $Xpath->findnodes('/CONFIG/item');
my $phone = $item[0]->findvalue('/CONFIG/item/phone');
print $phone

输出:

1234578876543321

$phone包含一个字符串,其中两个数字连接为单个实体

我甚至尝试返回数组上下文,它仍然返回一个连接两个数字的元素

你能帮我分别得到这两个电话号码吗?

1 个答案:

答案 0 :(得分:2)

我不清楚为什么您认为必须涉及XML::LibXML::XPathContext,因为您显示的XML数据中没有名称空间

您的电话

my @item = $Xpath->findnodes('/CONFIG/item');

返回数组XML::LibXML::Element中的单个@items对象,因为只有一个/CONFIG/item节点。但接下来你的电话

my $phone = $item[0]->findvalue('/CONFIG/item/phone');

忽略该节点的上下文,因为您已指定了绝对XPath表达式。它重新扫描文档,查找所有/CONFIG/item/phone元素并连接其文本值,并按照您的看法提供1234578876543321

我发现在此Perl模块中实现了findfindvalue,并始终依赖findnodes,这使事情变得非常简单

use strict;
use warnings 'all';

use XML::LibXML;

my $dom = XML::LibXML->load_xml(location => 'CONFIG.xml');

print $_->textContent, "\n" for $dom->findnodes('/CONFIG/item/phone');

输出

1234578
876543321

如果您需要数组中的这些值,请使用map

my @phones = map { $_->textContent } $dom->findnodes('/CONFIG/item/phone');