为什么我应该将 XPathContext 与 Perl 的 XML::LibXML 一起使用? [英] Why should I use XPathContext with Perl's XML::LibXML?

查看:29
本文介绍了为什么我应该将 XPathContext 与 Perl 的 XML::LibXML 一起使用?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

此脚本在使用和不使用 XPathContext 的情况下都可以工作.为什么我应该将它与 XPathContext 一起使用?

This script works with and without XPathContext. Why should I use it with 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 元素的主要原因是命名空间.您的文档没有名称空间,因此 XPathContexts 不会向您的查询添加任何内容.现在,假设您实际上拥有以下 xml

The primary reason for using XPathContext elements is namespaces. Your document has no namespaces so XPathContexts don't add anything to your query. Now, imagine that you actually had the following 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 查询:

You would need to define an XPathContext in order to have namespaces defined so that you could make namespace aware XPath queries:

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"]' );

否则,您就没有简单的方法来使用命名空间感知 XPath 语句.

Otherwise, you have no simple way to use namespace aware XPath statements.

这篇关于为什么我应该将 XPathContext 与 Perl 的 XML::LibXML 一起使用?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆