perl xml中的正则表达式未按预期工作

ee7vknir  于 2022-11-15  发布在  Perl
关注(0)|答案(1)|浏览(125)

我是这里的新手,我试图搜索和替换一个XML文件中的字符串,如下所示:

<name>xxx.yyy_zzz</name>
      <constructor_arguments />
      <parameters>
        <parameter>
          <name>Name</name>
          <string>
            <value>yyy</value>
          </string>
        </parameter>
        <parameter>
          <name>abc</name>
          <bool>
            <value>false</value>
          </bool>
        </parameter>
        <parameter>
          <name>abcd</name>
          <bool>
            <value>true</value>
          </bool>
        </parameter>
        <parameter>
          <name>aa</name>
          <integer>
            <value>10</value>
          </integer>
        </parameter>
        <parameter>
          <name>bb</name>
          <integer>
            <value>100</value>
          </integer>
        </parameter>
        <parameter>
          <name>runtime_disabled</name>
          <bool>
            <value>false</value>
          </bool>

我已经尝试了以下方法将runtime_disabled值更改为true,但没有发生我预期会发生的情况,有人能告诉我为什么会发生这种情况,并提供适当的解决方案使其正常工作吗

$data=~ s/(xxx\.i\yyy\_zzz\s*?<\/name>(.+?)runtime_disabled\s*?<\/name>\s*?<bool>\s*?<value>\s*?<value>.*?<\/value>)/$1true$2/g;
7uzetpgm

7uzetpgm1#

解析格式良好的XML实际上 * 总是 * 应该使用模块来完成。关于这一点,人们已经说了很多,例如this pagethis page,还有很多其他的例子。我也听说truly bad things may come to pass不是这样。
下面是一个如何使用XML::libXML完成任务的示例。另一个优秀的模块是XML::Twig。我完成了您的示例,使其成为一个格式良好的XML文件(如下所示的代码)。

use strict 'all';
use warnings;

use XML::LibXML;    

my $file = 'file.xml';

my $doc = XML::LibXML->load_xml(location => $file, no_blanks => 1); 

# Form the XPath expression used to find the 'name' nodes
my $xpath = '//doc/constructor_arguments/parameters/parameter/name';

foreach my $node ($doc->findnodes($xpath)) 
{
    # Select the particular 'name' tag that is needed
    if ($node->to_literal eq 'runtime_disabled') 
    {   
        # Query the parent node, for <name>'s sibling <bool>
        foreach my $bval ($node->parentNode->findnodes('./bool/value/text()')) 
        {
            my $content = $bval->toString;
            $content =~ s/false/true/;
            $bval->setData($content);
        }
    }   
}

# Write a new file with the change
$doc->toFile('changed_' . $file, 1);

这意味着是基本的,有相当多的其他方法来做同样的事情。
张贴的示例填充如下

<doc>
... posted text ...
            </parameter>
        </parameters>
    </constructor_arguments>
</doc>

相关问题