Perl:从XML获取价值

时间:2015-08-28 22:03:28

标签: xml perl xml-libxml

我需要从这个xml中获取价值 - http://pastebin.com/wkh7trd4。这是我的代码,但它什么都没有返回:

my $xml = XML::LibXML->new('clean_namespaces' => 1)->parse_file("$tmp_dir/xml/$xml_file_name");
my $xc = XML::LibXML::XPathContext->new($xml);
my $val = $xc->findvalue('/ns2:export/ns2:bankGuarantee/docPublishDate');
print $val;

3 个答案:

答案 0 :(得分:1)

看起来它与默认名称空间有关。不确定xpath是如何工作的,但@miller似乎在这里回答了他自己的问题:XML::LibXML, namespaces and findvalue

您可以尝试使用以下内容来解决您的问题

use strict;
use warnings;
use XML::LibXML;

open(my $xml_file, '<', "xml_to_parse.xml");
my $xml = new XML::LibXML->load_xml(IO => $xml_file);
print $xml->findvalue('/ns2:export/ns2:bankGuarantee/*[local-name()="docPublishDate"]'), "\n";

答案 1 :(得分:0)

库通常会在失败时抛出异常,如果你没有捕获它们,它们可能会无声地失败。

尝试:

use strict;
use warnings FATAL => 'all';

eval
{
    my $xml = XML::LibXML->new('clean_namespaces' => 1)->parse_file("$tmp_dir/xml/$xml_file_name");
    my $xc = XML::LibXML::XPathContext->new($xml);
    my $val = $xc->findvalue('/ns2:export/ns2:bankGuarantee/docPublishDate');
    print $val;
}
if($@)
{
    print "ERROR: " . $@;
}

如果一个失败,它应该给你一个错误。

答案 2 :(得分:0)

只创建一个XML::LibXML:XPathContext对象不会有任何区别,您还需要注册要在XPath表达式中使用的所有命名空间。在这种情况下,您已经使用了ns2命名空间而没有注册任何名称空间

您的代码看起来应该是这样的

my $xml = XML::LibXML->new->parse_file("$tmp_dir/xml/$xml_file_name");

my $xc = XML::LibXML::XPathContext->new($xml);
$xc->RegisterNs( ns2 => 'http://example.com/ns2/uri/address');

my $val = $xc->findvalue('/ns2:export/ns2:bankGuarantee/docPublishDate');
print $val;

请注意,您注册的URI必须与

中的URI匹配
xmlns:ns2="http://example.com/ns2/uri/address"
数据中的

属性

我想知道clean_namespaces解析器选项是否是您尝试解决这个问题? clean_namespaces只会删除冗余名称空间,即那些未在XML文档中的任何位置使用的名称空间。这样做没有什么意义,因为你几乎没有机会发生命名空间冲突,节省的时间和内存可以忽略不计