【问题标题】:Need to update xml tags which would be given as input to the perl script?需要更新作为 perl 脚本输入的 xml 标签?
【发布时间】:2014-04-02 08:05:08
【问题描述】:

我打算编写一个脚本来更新 xml 标记值。

我的要求:

  1. 需要更改的标记值由用户选择。有时可能不止一个。
  2. 如果用户给定的标签在 xml 中不存在,脚本应该抛出错误。

我面临的第一个挑战是,要注意哪个 perl 模块。我已经使用 XML::Twig 更新了一组标签 (How to print element names using XML::Twig),但是 xml 标签名称在脚本中是硬编码的。

但我目前的要求是从用户那里获取标签名称和要更新的值。

关于从用户获取输入,我有一个想法,即创建一个纯文本文件,用户可以在其中提供标签名称及其相应的值。脚本将解析文本文件并相应地选择标签及其值。这是个好主意还是有更好的方法?

有人可以提一下这个要求吗?

它是一个简单的 xml 文件,类似于这样

这将是一个简单的 xml 文件

<config>
  <tag1>alpha</tag1>
  <tag2>beta</tag2>
  <tag3>gamma</tag3>
</config>

可能有许多类似方式的标签。

假设用户想要更新 tag2,他给 tag2 和它的新值 "beta is updated" 。现在脚本应该首先检查 tag2 是否存在,如果是,那么它应该更新新值。

【问题讨论】:

    标签: xml perl xml-parsing


    【解决方案1】:

    首先,您的xml 格式不正确。我已经修复了结束标签。你也应该在你的问题中这样做。

    您可以使用XML::Twig 模块解决此问题,将其中一个参数用作xpath 表达式:

    #!/usr/bin/env perl
    
    use warnings;
    use strict;
    use XML::Twig;
    
    XML::Twig->new(
        twig_handlers => {
            $ARGV[0] => sub {
                $_->set_text( $ARGV[1] );
            }   
        },  
        pretty_print => 'indented',
    )->parsefile( pop )->print;
    

    第一个参数是要修改的标签,第二个参数是要替换的文本,第三个是输入文件,运行如下:

    perl script.pl tag2 "beta is updated" xmlfile
    

    产生:

    <config>
      <tag1>alpha</tag1>
      <tag2>beta is updated</tag2>
      <tag3>gamma</tag3>
    </config>
    

    【讨论】:

    • 谢谢,它有效,如果我想要更新多个标签怎么办?并且如果在 xml 中找不到输入标签名称,它应该抛出一条警告消息并跳过该标签的处理。
    • @chidori:您可以在twig_handlers hashref 中使用任意数量的表达式。对于警告,您可以在任何匹配中增加一个计数器,最后检查其值以打印警告。试一试。
    • 需要更改的数字标签完全取决于用户。所以有时它可能是一个,有时不止一个。在当前脚本中,我们指定要解析的标签数量$ARGV[0] =&gt; sub {$_-&gt;set_text( $ARGV[1] ),但是当要编辑的标签数量不固定并且每次运行脚本时由用户选择时,我该怎么办。
    猜你喜欢
    • 2021-12-09
    • 2012-01-02
    • 2018-07-20
    • 1970-01-01
    • 2017-07-16
    • 2015-10-12
    • 1970-01-01
    • 2016-03-05
    • 1970-01-01
    相关资源
    最近更新 更多