Perl libxml更新给定xml唯一ID的属性值

时间:2014-04-29 09:21:31

标签: perl libxml2

我需要一个帮助来更新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制作

2 个答案:

答案 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>