Я пытаюсь обновить содержимое элемента xml. Я использую XML :: LibXML и должен использовать эту библиотеку. Вот несколько примеров данных.Perl XML :: LibXML update contect
<data-table>
<data>
<number>1</number>
<letter>one</letter>
</data>
<data>
<number>2</number>
<letter>two</letter>
</data>
</data-table>
То, что я хотел бы сделать, это изменить содержание письма «Purple», если число равно 2. Тем не менее, я считаю, у меня проблема, обозначающая Xpath для его работы. Я получаю следующую ошибку
«Не удается найти метод объекта„УстановитьДанные“с помощью пакета„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>
'findnodes' не возвращает узел. Он возвращает список узлов или NodeList. См. Ответ на связанный вопрос, как это сделать. – ikegami
спасибо. Я видел это в своих поисках. но я тоже не могу удалить узел. Я понимаю, что findnodes не возвращает узел, но я зацикливаю узлы, как только я получу один, почему я не могу выполнять на нем действия? Это та часть, которую я не понимаю. Или правильный способ сделать это в первую очередь. Так я должен удалить все дочерние узлы , когда я нашел совпадение, а затем воссоздал все дочерние узлы ? это было бы неэффективно по моему сценарию. – ScottEdge
Вы, кажется, пропустили, что связанное сообщение показывает, как получить узел – ikegami