我正在尝试更新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>
答案 0 :(得分:2)
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');
}