PERL LibXML Parser

时间:2015-12-10 09:55:04

标签: xml perl xml-libxml

我正在使用我需要处理的XML

  <table>
    <col1>check1</col1>
    <col2>check2</col2>
    <col3>check3</col3>
    <content>
        <data>gt1</data>
        <data>check_gt1</data>
    </content>
    <content>
        <data>gt2</data>
        <data>check_gt2</data>
    </content>
</table>

我编写了以下代码来处理这个XML

my $parser = XML::LibXML->new();
my $respDom = $parser->parse_string($xmldata);
my @rowNodes = $respDom->getDocumentElement->findnodes("//content");

if(scalar @rowNodes > 0) 
{
    print "\nRow nodes size is ".scalar @rowNodes."\n"; 
    foreach my $rowNode (@rowNodes) {
          my $colNode = $rowNode->findnodes("//data")->[0];           
          my $num = $colNode->textContent;

          print "\nNUM is ".$colNode;
    }
}

我的结果显示节点的大小&#34;内容&#34;是2.但它返回&#34; gt1&#34;在循环中两次,它没有返回&#34; gt2&#34;在第二次迭代中。

我有什么需要改变的吗?

1 个答案:

答案 0 :(得分:1)

用于查找data节点的XPath表达式是错误的。带//foo的XPath将搜索具有该名称的任何元素。它在整个文档树中搜索,而不仅是在该节点下面。使用->[0],它将始终返回第一个匹配项,即完整文档的gt1

删除斜杠。

my $colNode = $rowNode->findnodes("data")->[0];

要检查$rowNode实际上是否包含完整的文档树,但只指向当前节点,请尝试以下操作:

my $colNode = $rowNode->findnodes("../content/data")->[0];

它还会给你gt1两次。