使用XML :: LibXML :: XPathContext使用Perl解析XML

时间:2014-03-31 11:21:57

标签: xml perl xpath

我有一个perl子例程,用于接收基本的xml文档,并使用xpath表达式从文档中收集特定信息。这是

    sub parseXml {
    my ($rawXml) = @_;
    print "Raw XML resonse:\n" . $rawXml . "\n";

    # Set up the XPath search.
    my $xp = XML::LibXML::XPathContext->new;
    my $node = $xp->getContextNode;
    $xp->setContextNode($node);

    # Extract a list apiece of ids, whos, and whats.
    my @ids = $xp->findnodes('//object/void[@property="id"]/int');
    my @whos = $xp->findnodes('//object/void[@property="who"]/string');
    my @whats = $xp->findnodes('//object/void[@property="what"]/string');

    # Iterate over the arrays to print the data.
    my $it = each_array(@ids, @whos, @whats);
    while (my ($id, $who, $what) = $it->()) {
    print sprintf("%2d: ", $id->string_value) . 
        $who->string_value . " -> '" . 
        $what->string_value . "'\n";
    }
}

问题是当我运行脚本时,我收到一条错误消息:

XPathContext:在第83行丢失当前节点

我做错了什么?我对perl非常陌生。

1 个答案:

答案 0 :(得分:3)

您不会在任何时候解析输入XML。鉴于$rawXml是一个字符串,请务必使用

my $dom = XML::LibXML->load_xml(string => $rawXml);
my $xp = XML::LibXML::XPathContext->new($dom);

我的猜测是第83行my $node = $xp->getContextNode;,由于文档当前为空,因此失败。无论如何你都不应该需要它,以及以下一行。