我正在尝试在<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');
答案 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('...');