我有一个很长的 xml,我希望更新其中一个非常深嵌套的标签的属性值,所以不想逐个节点地去。预期节点的结构也不相同,如下所示:输入 XML 为:
<Re>
<Co Class="Parameter" ID="CSCP001" Status="Available">
<FileSpec URL="c://mine/testfiles/wln/c.txt"/>
<CoOp Operation="Tag" SourceCS="RGB" SourceObjects="All">
<FileSpec Resource="SourceProfile" URL="c://mine/testfiles/wln/d.txt"/>
</CoOp>
</Co>
<Ru Class="Parameter" ID="IDR002" PartIDKeys="Run" Status="Available">
<Ru EndOfDocument="true" Pages="0" Run="1" RunTag="First">
<La>
<FileSpec URL="c://mine/testfiles/wln/e.txt"/>
</La>
</Ru>
</Ru>
</Re>
我希望输出 xml 为
<Re>
<Co Class="Parameter" ID="CSCP001" Status="Available">
<FileSpec URL="d://yours/wln/c.txt"/>
<CoOp Operation="Tag" SourceCS="RGB" SourceObjects="All">
<FileSpec Resource="SourceProfile" URL="d://yours/wln/d.txt"/>
</CoOp>
</Co>
<Ru Class="Parameter" ID="IDR002" PartIDKeys="Run" Status="Available">
<Ru EndOfDocument="true" Pages="0" Run="1" RunTag="First">
<La>
<FileSpec URL="d://yours/wln/e.txt"/>
</La>
</Ru>
</Ru>
</Re>
我尝试使用简单的 xml,xmllib 但无法完成所需的操作。我是 perl 编程的新手。
use XML::LibXML qw( );
use XML::LibXML;
use Data::Dumper;
my $xml = "a.txt";
my $xpath_expression = 'FileSpec';
my $parser = XML::LibXML->new();
my $doc = $parser->parse_file($xml) or warn "Could not";
my $parser1 = XML::LibXML::Element->new($xml);
for my $FileSpec1 ($doc->getElementsByTagName('FileSpec'))
{
print $FileSpec1;
my $xpath = '$FileSpec1/@URL';
my ($attr) = $doc->findnodes($xpath);
$attr->setValue('dfdsa');
my ($URL1) = $FileSpec1->findvalue('@URL');
print $URL1;
}
我尝试使用 $node->setAttribute( $aname, $avalue ); 但这是抛出异常。请指教。