2011-12-07 23 views
7

我要替换xml文件XML ::的libxml更换滤芯值

一个“VAL1”元素的值,出于某种原因,它并没有为我工作:

<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');  

的errror是获得是“无法通过包”XML :: LibXML :: Element找到对象方法“setValue”“

回答

7

NodeElement类中没有setValue方法,请参阅文档以获取可用方法列表。可以移除元素的子元素并添加新的文本节点li关键字:

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

你从哪里得到setValue?没有XML::LibXML对象有这样的方法。

此外,一个元素没有值,所以你绝对不能设置它。

VAL1”是元素的子节点的值,text node

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'); 
+0

谢谢!它的工作 –