我有以下处理所需的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
。