2013-09-26 71 views
1

我想追加<value></value>之間的字符串,附加價值XML節點用perl

<?xml version="1.0" encoding="UTF-8"?> 
<rs:alarm-request throttlesize="100" xmlns:rs="http://url.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.url.com"> 
    <rs:attribute-filter> 
    <search-criteria xmlns="http://www.url"> 
    <filtered-models> 
     <equals> 
     <attribute id="0x1144f50"> 
     <value></value> 
     </attribute> 
     </equals> 
     </filtered-models> 
    </search-criteria> 
    </rs:attribute-filter> 
    <!-- Models of Interest --> 
    <rs:target-models> 
    </rs:target-models> 
</rs:alarm-request> 

我用下面的代碼,但我不斷收到: 無法找到對象的方法「appendTextNode 「via package」XML :: LibXML :: NodeList「

my $parser  = XML::LibXML->new(); 

# Insert devices MH to GETdevices_xmlbody template 
my $doc = $parser->parse_file($current_working_dir.'\GETdevices_xmlbody.xml'); 
my $elem = $doc->findnodes('//rs:attribute-filter/search-criteria/filtered-models/equals/attribute/value'); 

# $elem->removeChildNodes(); 
$elem->appendTextNode('STRING'); 
+0

如果你的XPath匹配,那麼你可以使用像'$ elem-> get_node(1) - > appendTextNode('STRING');' –

回答

4

您可以使用XML::Twig太:

內容的 script.pl

#!/usr/bin/env perl 

use warnings; 
use strict; 
use XML::Twig; 

my $twig = XML::Twig->new(
    twig_handlers => { 
     '//rs:attribute-filter/search-criteria/filtered-models/equals/attribute/value' => sub { 
      $_->set_text('STRING'); 
     }, 
    }, 
    pretty_print => 'indented', 
)->parsefile(shift)->print; 

運行它想:

perl script.pl xmlfile 

國債收益率:

<?xml version="1.0" encoding="UTF-8"?> 
<rs:alarm-request throttlesize="100" xmlns:rs="http://url.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.url.com"> 
    <rs:attribute-filter> 
    <search-criteria xmlns="http://www.url"> 
     <filtered-models> 
     <equals> 
      <attribute id="0x1144f50"> 
      <value>STRING</value> 
      </attribute> 
     </equals> 
     </filtered-models> 
    </search-criteria> 
    </rs:attribute-filter> 
    <!-- Models of Interest --> 
    <rs:target-models></rs:target-models> 
</rs:alarm-request> 
3

您要求獲取符合條件的所有節點。你需要循環它們。

my $elems = $doc->findnodes('...'); 
for my $elem ($elems->get_nodelist) { 
    ... 
} 

簡單:

my @elems = $doc->findnodes('...'); 
for my $elem (@elems) { 
    ... 
} 

如果你只是希望只有一個,你可以只搶了先之一。

my ($elem) = $doc->findnodes('...'); 
+0

這只是問題的一部分。另一個原因是XPath根本不匹配,因爲從開始,還有另一個必須處理的名稱空間。所以無論是'XML :: LibXML :: XPathContext'都必須被使用,或者XPath表達式必須被重寫爲只執行'/ * [local-name()=「element」]'匹配。 –