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 для его работы. Я получаю следующую ошибку
"Не удается найти метод объекта"setData"через пакет"XML::LibXML::NodeList"в"
Я боролся с этим в течение нескольких дней, поэтому любая помощь очень ценится.
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>
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');
}