我需要一个帮助来更新xml中给定唯一ID的现有xml文件属性,
Xml看起来像输入
<TextLine>
<String ID="S14" CONTENT="Gun" SUBS_TYPE="HypPart1" SUBS_CONTENT="Gun"/>
</TextLine>
<TextLine>
<String ID="S15" CONTENT="nersen" SUBS_TYPE="HypPart1" SUBS_CONTENT="nersen"/>
</TextLine>
输出看起来
<TextLine>
<String ID="S14" CONTENT="Gun" SUBS_TYPE="HypPart1" SUBS_CONTENT="Gunnersen"/>
</TextLine>
<TextLine>
<String ID="S15" CONTENT="nersen" SUBS_TYPE="HypPart1" SUBS_CONTENT="Gunnersen"/>
</TextLine>
我正在更新SUBS_CONTENT属性。
当我循环通过String我能够更新当前元素,但我没有下一个字符串值,在阅读下一行后我可以合并内容,我可以插入 SUBS_CONTENT < / p>
我的代码看起来
foreach my $PAGE1 ($pagetext->findnodes('//String')){
my $sCurArt = $PAGE1->findvalue('@ID');
if ($sCurArt eq $id) {
my ($TextBlockIDx) = $PAGE1->findnodes('@SUBS_CONTENT');
$TextBlockIDx->setValue($text);
last;
}
}
请帮帮我......
有没有办法用给定的xml ID设置setValue(S14,S15)。
提前致谢....
Umesh制作
答案 0 :(得分:0)
我不是100%确定我理解你的规范,但这就是我要做的事情:
#!/usr/bin/perl
use warnings;
use strict;
use XML::LibXML;
my $xml = 'XML::LibXML'->load_xml(IO => *DATA{IO});
my @ids = qw(S14 S15);
my @strings = map $xml->findnodes('//TextLine/String[@ID="' . $_ . '"]'), @ids;
my $new = join q(), map $_->findvalue('@SUBS_CONTENT'), @strings;
$_->setAttribute('SUBS_CONTENT', $new) for @strings;
print $xml->toString;
__DATA__
<r>
<TextLine>
<String ID="S14" CONTENT="Gun" SUBS_TYPE="HypPart1" SUBS_CONTENT="Gun"/>
</TextLine>
<TextLine>
<String ID="S15" CONTENT="nersen" SUBS_TYPE="HypPart1" SUBS_CONTENT="nersen"/>
</TextLine>
</r>
我从XML中检索部分字符串,将它们连接到$ new,然后将$ new设置为属性的新值。
答案 1 :(得分:0)
您似乎只需要XML::LibXML::Element
中的setAttribute
方法。还有getAttribute
方法。
use strict;
use warnings;
use XML::LibXML;
my $data = do { local $/; <DATA> };
my $doc = XML::LibXML->load_xml(string => $data);
for my $node ($doc->findnodes('//String[@ID="S14" or @ID="S15"]')) {
$node->setAttribute('SUBS_CONTENT' => 'Gunnerson');
}
print $doc->toString();
__DATA__
<root>
<TextLine>
<String ID="S14" CONTENT="Gun" SUBS_TYPE="HypPart1" SUBS_CONTENT="Gun"/>
</TextLine>
<TextLine>
<String ID="S15" CONTENT="nersen" SUBS_TYPE="HypPart1" SUBS_CONTENT="nersen"/>
</TextLine>
</root>