此脚本适用于和不适用 XPathContext
。为什么我应该将它与 XPathContext
一起使用?
#!/usr/bin/env perl
use warnings; use strict;
use XML::LibXML;
use 5.012;
my $parser = XML::LibXML->new;
my $doc = $parser->parse_string(<<EOT);
<?xml version="1.0"?>
<xml>
Text im Dokument
<element id="myID" name="myname" style="old" />
<object objid="001" objname="Object1" />
<element id="002" name="myname" />
</xml>
EOT
#/
# without XPathContext
my $nodes = $doc->findnodes( '/xml/element[@id=002]' );
# with XPathContext
#my $root = $doc->documentElement;
#my $xc = XML::LibXML::XPathContext->new( $root );
#my $nodes = $xc->findnodes( '/xml/element[@id=002]' );
for my $node ( $nodes->get_nodelist ) {
say "Node: ", $node->nodeName;
print "Attribute: ";
print $_->getName, '=', $_->getValue, ' ' for $node->attributes;
say "";
}
最佳答案
使用 XPathContext 元素的主要原因是命名空间。您的文档没有 namespace ,因此 XPathContexts 不会向您的查询添加任何内容。现在,假设您实际上拥有以下 xml
my $doc = $parser->parse_string(<<EOT);
<?xml version="1.0"?>
<xml xmlns="http://my.company.com/ns/nsone"
xmlns:ns2="http://your.company.com/nstwo">
Text im Dokument
<ns2:element id="myID" name="myname" style="old" />
<object objid="001" objname="Object1" />
<element id="002" name="myname" />
</xml>
EOT
您需要定义一个 XPathContext 以便定义命名空间,以便您可以进行命名空间感知 XPath 查询:
my $root = $doc->documentElement;
my $xc = XML::LibXML::XPathContext->new( $root );
$xc->registerNs("ns2", "http://your.company.com/nstwo");
$xc->registerNs("ns1", "http://my.company.com/nsone");
my $nodes = $xc->findnodes( '/ns1:xml/ns2:element[@id="myID"]' );
否则,您没有简单的方法来使用 namespace 感知 XPath 语句。
关于xml - 为什么我应该将 XPathContext 与 Perl 的 XML::LibXML 一起使用?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2673370/