【问题标题】:Perl XML::LibXML update content [duplicate]Perl XML::LibXML 更新内容 [重复]
【发布时间】:2013-02-09 22:41:01
【问题描述】:

我正在尝试更新 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。请参阅链接问题的答案以了解如何操作。
  • 谢谢。我在搜索中看到了这一点。但我也无法删除节点。我意识到 findnodes 没有返回一个节点,但是一旦我得到一个节点,我就会循环遍历这些节点,为什么我不能对它执行操作呢?那是我不理解的部分。或者首先是正确的方法。那么当我找到匹配项时是否必须删除 的所有子节点然后重新创建 的所有子节点?这在我的整体情况下效率不高。
  • 您似乎错过了链接的帖子显示如何获取节点

标签: xml perl xml-libxml


【解决方案1】:

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');
}

【讨论】:

  • 我很感谢这个答案,但我对阅读文档和示例的时间感到沮丧,但没有像您的第二个示例那样考虑这样做。
  • 你把我的 12 行代码变成了 6 行。
  • XML::LibXML 不记录 XPath。我真的称之为 2 或 3 行。
  • 是的,我找不到任何 Xpaths 文档。它实际上是 2 行,但我的意思是在我的整个项目中。这只是我提取的一个简单示例,以便获得帮助。再次感谢我真的很感激。
猜你喜欢
  • 2013-03-04
  • 1970-01-01
  • 2013-05-11
  • 2019-08-12
  • 1970-01-01
  • 2017-10-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多