【发布时间】: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