xml - 在 Perl 中,如何在不更改 XML 文件格式的情况下更改 XML 文件中的元素?

标签 xml perl

我有一个格式的 XML 文件:

<outer1>
    <inner1>
        <name>Stonecold</name>
        <profession>warrior</profession>
        <org>wwf</org>
    </inner1>
    <inner1>
        <name>Shanebond</name>
        <profession>Bowler</profession>
        <org>newzealand</org>
    </inner1>
    <inner1>
        <name>brain schemidit</name>
        <profession>Chairman</profession>
        <org>Google</org>
    </inner1>
</outer1>

我想将 Shanebond 的值更改为 Shane Bond

我使用的是 XML::Simple,但结果是一个散列。

我想要与输入文件相同的格式。例如:输出文件应如下所示:

<outer1>
    <inner1>
        <name>Stonecold</name>
        <profession>warrior</profession>
        <org>wwf</org>
    </inner1>
    <inner1>
        <name>Shane Bond</name>
        <profession>Bowler</profession>
        <org>newzealand</org>
    </inner1>
    <inner1>
        <name>brain schemidit</name>
        <profession>Chairman</profession>
        <org>Google</org>
    </inner1>
</outer1>

请指教如何做到这一点。

提前致谢。

我希望将输出文件保存在同一目录中,并尽可能使用相同的名称。可能吗?

最佳答案

当涉及到读取或操作 XML 文件时 XML::Twig通常是我希望使用的第一个工具。

起初我认为这对您的要求来说可能有点矫枉过正,但后来我注意到它确实带有一个 parsefile_inplace() 选项:

use strict;
use warnings;
use XML::Twig;

XML::Twig->new(
    pretty_print  => 'indented',
    twig_handlers => { 
        name => sub { 
            $_->set_text( 'Shane Bond' )->flush  if $_->text eq 'Shanebond' 
        },
    },
)->parsefile_inplace( 'data.xml', 'bak_*' );

注意。如果您不想保留备份文件,请删除第二个参数('bak_*')。

关于xml - 在 Perl 中,如何在不更改 XML 文件格式的情况下更改 XML 文件中的元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1327720/

相关文章:

regex - 如何通过 sed/perl 删除行同时保留某些字符?

c# - 使用 XML 注释创建的 C# 文档在哪里 (Visual Studio 2010)?

jquery - 如何使用 JQuery 获取属性等于某个值的所有节点?

perl - 尝试在 Windows 7 上安装 MinGW 和 Tk for Perl

perl - 如何使用 IO::Async 并以数组作为输入?

perl - 变量替换/扩展 - Perl 中的安全方式

Perl,使用tr函数同时将大写转换为小写,反之亦然?

sql-server - SQL Server 中的 XQuery 与 OpenXML

java - Android - 无法解析符号 "R"

c# - 使用命名空间解析 XML 文件