我正在使用我需要处理的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;在第二次迭代中。
我有什么需要改变的吗?
答案 0 :(得分:1)
用于查找data
节点的XPath表达式是错误的。带//foo
的XPath将搜索具有该名称的任何元素。它在整个文档树中搜索,而不仅是在该节点下面。使用->[0]
,它将始终返回第一个匹配项,即完整文档的gt1
。
删除斜杠。
my $colNode = $rowNode->findnodes("data")->[0];
要检查$rowNode
实际上是否包含完整的文档树,但只指向当前节点,请尝试以下操作:
my $colNode = $rowNode->findnodes("../content/data")->[0];
它还会给你gt1
两次。