我有一个不完整的Perl脚本,内容如下:
use XML::LibXML;
use XML::LibXSLT;
my $xml_mess = "
<activity>
<ref1></ref1>
<ref2>id_119604</ref2>
<ref3>id_342432</ref3>
</activity>";
my $parser = XML::LibXML->new();
my $xml_mess_obj = $parser -> parse_string($xml_mess);
my $ref1 = $xml_mess_obj -> getDocumentElement -> findNodes("/activity/ref1") -> [0] -> to_literal();
my $ref2 = $xml_mess_obj -> getDocumentElement -> findNodes("/activity/ref2") -> [0] -> to_literal();
my $ref3 = $xml_mess_obj -> getDocumentElement -> findNodes("/activity/ref3") -> [0] -> to_literal();
我想解析$xml_mess
并进行以下更改:
- 当
ref3
有一个值时,我希望ref1
具有相同的值。 - 当
ref3
没有值时,我希望ref1
具有与ref2
相同的值。
我一直在寻找有关如何使用 LibXML 执行此操作的示例,但无法弄清楚如何有条件地更新节点。
这似乎可以做你想做的事。有关更多详细信息,请参阅嵌入的注释。
#!/usr/bin/perl
use strict;
use warnings;
use feature 'say';
use XML::LibXML;
my $xml_mess = '
<activity>
<ref1></ref1>
<ref2>id_119604</ref2>
<ref3>id_342432</ref3>
</activity>';
# Load the XML into a Document object
my $xml_mess_obj = XML::LibXML->load_xml(string => $xml_mess);
# Get an Element object for the <ref1> node.
my $ref1 = $xml_mess_obj->findnodes('//ref1')->[0];
# Get the text of the <ref2> and <ref3> nodes.
my $ref2_txt = $xml_mess_obj->findnodes('//ref2')->[0]->to_literal;
my $ref3_txt = $xml_mess_obj->findnodes('//ref3')->[0]->to_literal;
# Use appendText() to add text to the <ref1> node.
# Note: // is the 'defined-or' operator. It returns $ref3_txt if that
# is defined, otherwise it returns $ref2_txt.
$ref1->appendText($ref3_txt // $ref2_txt);
# Display the result.
say $xml_mess_obj->toString;