我的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
包含一个字符串,其中两个数字连接为单个实体
我甚至尝试返回数组上下文,它仍然返回一个连接两个数字的元素
你能帮我分别得到这两个电话号码吗?
答案 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模块中实现了find
和findvalue
,并始终依赖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');