我正在尝试从以下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::LibXML
和XML::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
中为我提供正确的值。
谢谢!
答案 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);