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两次