Perl:从 XML 中获取值

Perl: Get value from XML

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

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;

库经常在失败时抛出异常,如果您不捕获它们,它们可能会默默地失败。

尝试:

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: " . $@;
}

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

看起来它与默认名称 space 有关。不确定 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";

只是创建一个 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 文档中任何地方都没有使用的名称空间。这样做没有什么意义,因为命名空间发生冲突的可能性很小,而且节省的时间和内存可以忽略不计