我有以下
XML作为示例:
<root xmlns="http://www.plmxml.org/Schemas/PLMXMLSchema" >
<parentNode status="Good">
<A>
<B>
<C id="123" >C Node Value Here</C>
</B>
</A>
</parentNode>
</root>
我的XML文件中有多个parentNode节点(这里只显示一个),所以我循环遍历parentNode.有了一个,我想在XML中获得更多级别的属性值.我的XML使用名称空间,我在Perl脚本中将名称空间注册为“plm”.我可以使用路径中的名称空间来获取parentNode属性值.但是当我尝试向下导航到节点“C”和拾取属性“id”时,我收到以下错误:
XPath错误:未定义的名称空间前缀
错误:xmlXPathCompiledEval:评估失败
我使用以下Perl脚本.
use XML::LibXML;
use XML::LibXML::XPathContext;
my $filename = "namespaceissue.xml";
my $parser = XML::LibXML->new();
my $doc = $parser->parse_file($filename);
my $xc = XML::LibXML::XPathContext->new( $doc->documentElement() );
$xc->registerNs('plm', 'http://www.plmxml.org/Schemas/PLMXMLSchema');
foreach my $node ($xc->findnodes('/plm:root/plm:parentNode')) {
my $status = $node->findvalue('./@status');
print "Status = $status\n";
my $val = $node->findvalue('./plm:A/plm:B/plm:C/@title');
print "Value = $val\n";
}
如果我在子节点./A/B/C上没有使用命名空间,则脚本继续没有错误,但没有为$val分配值.如果我添加plm:前缀,我会得到命名空间错误.有谁知道我在做错了什么?我是否必须使用findnodes首先找到子节点,然后使用findvalue提取值?我也试过了,没有运气.
最佳答案
$node->findvalue('./plm:A/plm:B/plm:C/@title')
应该
$xc->findvalue('./plm:A/plm:B/plm:C/@id', $node)
提示:
>那些领先的./没用.
$node->findvalue('./@status')
$xc->findvalue('./plm:A/plm:B/plm:C/@id', $node)
是一样的
$node->findvalue('@status')
$xc->findvalue('plm:A/plm:B/plm:C/@id', $node)
>您可以使用getAttribute获取元素的属性,所以
$node->findvalue('@status')
也可以使用更有效地完成
$node->getAttribute('status')