XML :: LibXML заменяет значение элемента - PullRequest
7 голосов
/ 07 декабря 2011

Я хочу заменить значение "VAL1" элемента в XML-файле

Почему-то у меня это не работает:

   <testing>
<application_name>TEST</application_name>
<application_id>VAL1</application_id>
<application_password>1234</application_password>
   </testing>

my $parser =XML::LibXML->new();
$tree   =$parser->parse_file($xml);
$root   =$tree->getDocumentElement;
my ($elem)=$root->findnodes('/testing/application_id');
$elem->setValue('VAL2');    

Ошибка get is "Canнайти метод объекта "setValue" через пакет "XML :: LibXML :: Element ..."

Ответы [ 2 ]

17 голосов
/ 07 декабря 2011

Откуда вы взяли setValue?Нет XML :: LibXML объект имеет такой метод.

Кроме того, элемент не имеет значения, поэтому вы определенно не можете его установить.* "- это значение дочернего узла элемента, текстового узла .

my ($application_id_text) = $root->findnodes('/testing/application_id/text()');
$application_id_text->setData('VAL2');

К сожалению, это не совсем безопасно.Что если элемент имеет несколько текстовых дочерних узлов?Что, если у него его вообще нет?

Более безопасный способ - захватить элемент, удалить все его дочерние элементы, которые являются текстовыми узлами (что легко сделать, удалив все его дочерние узлы), идобавьте новый текстовый узел с нужным значением.

my ($application_id_node) = $root->findnodes('/testing/application_id');
$application_id_node->removeChildNodes();
$application_id_node->appendText('VAL2');
7 голосов
/ 07 декабря 2011

В классах Node или Element нет метода setValue, список доступных методов см. В документации. Вы можете удалить дочерние элементы элемента и добавить новый текстовый узел следующим образом:

$elem->removeChildNodes();
$elem->appendText('VAL2');
...