使用命名空间时,使用Perl和LibXML获取子节点值

我有以下
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')
点赞