Perl XML::LibXML更新内容



我正在尝试更新xml元素的内容。我正在使用XML::LibXML,并且需要使用这个库。这是一些样本数据。

<data-table>
   <data>
      <number>1</number>
      <letter>one</letter>
   </data>
   <data>
      <number>2</number>
      <letter>two</letter>
   </data>
</data-table>

如果数字是2,我想把字母的内容改为"紫色"。然而,我相信我在指定Xpath以使其工作时遇到了问题。我得到以下错误

无法通过位于的包"XML::LibXML::NodeList"定位对象方法"setData"

我已经挣扎了好几天了,所以我们非常感谢您的帮助。

 use XML::LibXML;
    my $p = XML::LibXML->new;
    my $d = $p->parse_fh(*DATA);
    for my $node ($d->findnodes('//data-table/data')) 
    { 
       for my $childNode ($node->findnodes('./number/text()'))
       {
          if($childNode->textContent() == '1')
          { # here is where the problem is!
             my $changeNumerNode = $node->findnodes('./letter/text()'); 
             $changeNumerNode->setData("Purple");
          }
       }
    }
    print $d->toString;
   __DATA__
   <data-table>
      <data>
         <number>1</number>
         <letter>one</letter>
      </data>
      <data>
         <number>2</number>
         <letter>two</letter>
      </data>
  </data-table>

findnodes不返回节点。它返回一个节点列表或一个::NodeList。您可以强制它返回一个列表,并获取返回的第一个节点。

for my $node ($d->findnodes('//data-table/data')) 
{ 
   my ($number_node) = $node->findnodes('number')
      or next;
   $number_node->textContent() eq '1'
      or next;
   my ($letter_text) = $node->findnodes('letter/text()')
      or next;
   $letter_text->setData('Purple');
}

(正如你所看到的,我删除了./的纯噪声使用。)

你甚至可以使用

for my $letter_text ($d->findnodes(
   '//data-table/data[number/text()="1"]/letter/text()')) 
{ 
   $letter_text->setData('Purple');
}

相关内容

  • 没有找到相关文章

最新更新