2013-12-11 2 views
1
<root> 
<element>abc</element> 
<top> 
<element>after</element> 
<element>before</element> 
</top> 
<element>456</element> 
</root> 

Я хочу вставить еще один элемент после элемента и перед элементом. Пробовал несколько вариантов, должен что-то упустить.insert after child libxml perl

#!/usr/bin/perl 
use strict; 
use warnings; 
use XML::LibXML; 

my $parser = XML::LibXML->new; 
my $doc = $parser->parse_file("mytest.xml"); 
my $root = $doc->getDocumentElement(); 
my @node = $doc->find('//top/element[2]'); 

my $new_element= $doc->createElement("element"); 
$new_element->appendText('testing'); 

$node[0]->insertAfter($new_element, undef); 

print $root->toString(1); 

ответ

2

$node[0] является ссылочный узел (т.е. узел, относительно которого мы хотим вставить). Назовем это $ref_node.

Ваш код страдает от следующих проблем:

  • Вы хотите вставить после первого element из top, а не второй.
  • Вы хотите вставить его в детский дом $ref_node->parentNode, а не $ref_node.
  • Вы хотите вставить его после $ref_node, не после undef.
  • Вы также используете find (который возвращает NodeList), когда вы хотите findnodes (который возвращает фактические узлы).

Так,

my ($ref_node) = $doc->findnodes('//top/element[1]'); 
$ref_node->parentNode->insertAfter($new_element, $ref_node); 
+0

ответ возвращается = Не удается найти метод объекта "ParentNode" с помощью пакета "XML :: Libxml :: NodeList". Примечание: Я получал это немного по некоторым из моих вариантов. – Paul

+0

@Paul: Таким образом, существует несколько узлов, соответствующих XPath. – choroba

+0

Не то, что я вижу, см. Данные XML и XPATH. Но, похоже, find возвращает нодлист с заданным xpath. Заметьте, это тоже дает мне такую ​​же ошибку my @ref_node = $ doc-> find ('// top/element [2]'); $ ref_node [0] -> parentNode-> insertAfter ($ new_element, $ ref_node [0]); – Paul