PERL LibXML 解析器
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(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;
}
}
我的结果显示节点 "content" 的大小是 2。但是它在循环中 returns "gt1" 两次,第二次没有返回 "gt2"迭代。
我需要对此进行更改吗?
您用于查找 data
节点的 XPath 表达式是错误的。具有 //foo
的 XPath 将搜索具有该名称的任何元素。它在整个文档树中搜索,而不仅仅是在该节点下。对于您的 ->[0]
,它总是 return 第一个匹配项,即 gt1
完整文档。
删除斜杠。
my $colNode = $rowNode->findnodes("data")->[0];
要检查 $rowNode
实际上包含完整的文档树,但只指向当前节点,试试这个:
my $colNode = $rowNode->findnodes("../content/data")->[0];
它还会给你gt1
两次
我正在关注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; } }
我的结果显示节点 "content" 的大小是 2。但是它在循环中 returns "gt1" 两次,第二次没有返回 "gt2"迭代。
我需要对此进行更改吗?
您用于查找 data
节点的 XPath 表达式是错误的。具有 //foo
的 XPath 将搜索具有该名称的任何元素。它在整个文档树中搜索,而不仅仅是在该节点下。对于您的 ->[0]
,它总是 return 第一个匹配项,即 gt1
完整文档。
删除斜杠。
my $colNode = $rowNode->findnodes("data")->[0];
要检查 $rowNode
实际上包含完整的文档树,但只指向当前节点,试试这个:
my $colNode = $rowNode->findnodes("../content/data")->[0];
它还会给你gt1
两次