使用LibXML和XPath查找带冒号的节点(本地命名空间)

时间:2015-08-26 08:43:10

标签: xml perl xpath libxml2

我正在尝试从以下XML中的@id1获取属性<Incoming>

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Incomings xmlns:ns2="http://testme.org/foo/schema">
    <Incoming id1="6bbaec22" id2="928c2081">
        <ns2:Address>fubar@test.com</ns2:Address>
    </Incoming>
</Incomings>

我可以传递的唯一信息是电子邮件地址fubar@test.com

我正在使用XML::LibXMLXML::LibbXML::XPathContext,如下所示:

my $dom = XML::LibXML->new->parse_file( $xml_file );  # XML contains as above
my $xpc = XML::LibXML::XPathContext->new( $dom->documentElement );
$xpc->registerNs('x', 'http://testme.org/foo/schema');

my $email = 'fubar@test.com';
my $xpath = "/x:Incomings/x:Incoming/x:ns2:Address[text()='$email']/../\@id1";
my @nodes = $xpc->findnodes( $xpath );

但它总是在 ns2:地址周围的$xpath中给出一个无效的表达。

我上面犯了什么错误?如果节点名称仅为<Address>,则从我的$xpath语句中删除 ns2:,在@nodes中为我提供正确的值。

谢谢!

1 个答案:

答案 0 :(得分:1)

在两个实例中,您在一个实例中搜索错误名称空间中的元素。你使用两个前缀是没有意义的。修正:

my $email = 'fubar@test.com';
my $xpath = "/Incomings/Incoming/x:Address[text()='$email']/../\@id1";
my @nodes = $xpc->findnodes($xpath);

我更愿意避免使用..。我使用以下内容:

my $email = 'fubar@test.com';
my $xpath = "/Incomings/Incoming[x:Address/text()='$email']/\@id1";
my @nodes = $xpc->findnodes($xpath);