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

我想在元素之後和元素之前插入另一個元素。 嘗試了一些變化,必須缺少一些東西。插入子元素後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

你的代碼具有以下問題:

  • 你想要的top第一element,而不是第二後插入。
  • 你想插入它作爲$ref_node->parentNode而不是$ref_node的孩子。
  • 想要在$ref_node之後插入,而不是在undef之後插入。
  • 當您需要findnodes(它返回實際節點)時,您也正在使用find(它返回一個NodeList)。

所以,

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

答案收益=無法通過包 「XML ::的libxml ::節點列表」,找到對象的方法 「parentNode」。 注意:我在某些變體上看到了這一點。 – Paul

+0

@Paul:所以有幾個節點與XPath匹配。 – choroba

+0

不是我看到的,請參閱給定的XML和XPATH。但是看起來無論如何,find都會返回給定xpath的nodelist。請注意,這也給了我同樣的錯誤我的@ ref_node = $ doc-> find('// top/element [2]'); $ ref_node [0] - > parentNode-> insertAfter($ new_element,$ ref_node [0]); – Paul