如何使用XML :: XPath获取父节点?

Dro*_*ror 3 xml perl xpath

我想使用xPaths解析XML文件.获取节点后,我可能需要在其父节点上执行xPath搜索.我目前使用XML :: XPath的代码是:

my $xp = XML::XPath->new(filename => $XMLPath);
# get all foo or foos node with a name
my $Foo = $xp->find('//foo[name] | //foos[name]');
if (!$Foo->isa('XML::XPath::NodeSet') || $Foo->size() == 0) {
    # no foo found
    return undef;
} else {
    # go over each and get its bar node
    foreach my $context ($Foo->get_nodelist) {
        my $FooName = $context->find('name')->string_value;
        $xp = XML::XPath->new( context => $context );
        my $Bar = $xp->getNodeText('bar');
        if ($Bar) {
            print "Got $FooName with $Bar\n";
        } else {
            # move up the tree to get data from parent
            my $parent = $context->getParentNode;
            print $parent->getNodeType,"\n\n";
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我的目标是获取foo元素名称及其bar子节点值的哈希,如果foo没有bar节点,它应该从其父foo或foos节点获取该节点.

对于这个XML:

<root>
    <foos>
        <bar>GlobalBar</bar>
        <foo>
            <name>number1</name>
            <bar>bar1</bar>
        </foo>
        <foo>
            <name>number2</name>
        </foo>
    </foos>
</root>
Run Code Online (Sandbox Code Playgroud)

我希望:

number1->bar1 
number2->GlobalBar
Run Code Online (Sandbox Code Playgroud)

使用上面的代码时,我在尝试获取父节点时收到错误:

无法在未定义的值上调用方法"getNodeType"

任何帮助都感激不尽!

Cha*_*ens 5

当您尝试调用方法时,您将看到该错误undef.调用方法的最常见原因undef是无法检查构造方法是否成功.更改

$xp = XML::XPath->new( context => $context );
Run Code Online (Sandbox Code Playgroud)

成为

$xp = XML::XPath->new( context => $context )
    or die "could not create object with args ( context => '$context' )";
Run Code Online (Sandbox Code Playgroud)

  • 另外,我会说你的问题是你通过第二次分配$ xp来破坏原始对象. (2认同)