使用perl将值附加到xml节点

时间:2013-09-26 20:12:47

标签: xml perl

我正在尝试在<value></value>

之间追加一个字符串
<?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>

我使用了以下代码,但我一直在使用: 无法通过包“XML :: LibXML :: NodeList”

找到对象方法“appendTextNode”
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');

2 个答案:

答案 0 :(得分: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>

答案 1 :(得分:3)

您要求获取符合条件的所有节点。你需要循环它们。

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

简单:

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

如果您只想要一个,那么您可以抓住第一个。

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