PERL LibXML Parser



我有以下处理所需的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(标量@rowNodes>0){print"\n行节点大小为".scalar@rowNodes。"\n";foreach my$rowNode(@rowNodes){my$colNode=$rowNode->findnodes("//data")->[0];my$num=$colNode->textContent;打印"\nNUM为"$colNode;}}

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

这件事我有什么需要改变的吗?

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

删除斜线

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

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

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

它还会给你两次gt1

最新更新