Perl Libxml-如果满足特定条件,则替换xml值

Perl Libxml-如果满足特定条件,则替换xml值,perl,xml-libxml,Perl,Xml Libxml,我有一个包含以下内容的不完整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 $x

我有一个包含以下内容的不完整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::LibXML;
使用XML::LibXSLT;
我的$xml\u mess=”
id_119604
id_342432
";
my$parser=XML::LibXML->new();
我的$xml\u mess\u obj=$parser->parse\u string($xml\u mess);
my$ref1=$xml\u mess\u obj->getDocumentElement->findNodes(“/activity/ref1”)->[0]->to\u literal();
my$ref2=$xml\u mess\u obj->getDocumentElement->findNodes(“/activity/ref2”)->[0]->to\u literal();
my$ref3=$xml\u mess\u obj->getDocumentElement->findNodes(“/activity/ref3”)->[0]->to\u literal();
我想解析
$xml\u 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;
    
    #/usr/bin/perl
    严格使用;
    使用警告;
    使用特征“说”;
    使用XML::LibXML;
    我的$xml\u
    id_119604
    id_342432
    ';
    #将XML加载到文档对象中
    我的$xml\u mess\u obj=xml::LibXML->load\u xml(字符串=>$xml\u mess);
    #获取节点的元素对象。
    my$ref1=$xml\u mess\u obj->findnodes('//ref1')->[0];
    #获取和节点的文本。
    my$ref2_txt=$xml_mess_obj->findnodes('//ref2')->[0]->to_literal;
    my$ref3_txt=$xml_mess_obj->findnodes('//ref3')->[0]->to_literal;
    #使用appendText()向节点添加文本。
    #注://是“已定义或”运算符。如果
    #已定义,否则返回$ref2_txt。
    $ref1->appendText($ref3_-txt//$ref2_-txt);
    #显示结果。
    说$xml\u mess\u obj->toString;
    
    请确保示例代码已编译。提示:
    ->getDocumentElement
    不是必需的。文档元素提供
    findNodes
    提示:
    ->findNodes(…)->[0]->to_literal()
    可以替换为
    ->findvalue(…)