2014-03-01 32 views
0

我打算写一个脚本来更新xml标记值。需要更新将作为perl脚本的输入提供的xml标签吗?

我的要求:必须加以改变将是用户choice.It的可能不止一个,有时

  1. 标记值。
  2. 如果给定标签的用户在xml中不存在,脚本应该会抛出一个错误。

的第一个挑战我面临的是,这Perl模块,看出来的。我已经使用XML :: Twig来更新一组标签(How to print element names using XML::Twig),但是那里的xml标签名称在脚本中被硬编码。

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

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

有人可以提出一个关于这个要求。

它这将是这样的

这将是一个简单的XML文件

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

可能有许多标签以类似的方式一个简单的XML文件。

可以说用户想要更新tag2并且他给出tag2并且其新值“beta被更新”。现在脚本应该首先检查tag2是否存在,如果是,那么它应该更新新的值。

+0

显示输入和输出XML的一个小示例。 – toolic

+0

如果这是输入,你想要的输出是什么?用这个新信息更新你的问题。 – toolic

+0

问题已经更新 – chidori

回答

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> 
+0

谢谢,它的工作原理和如果我想要更新一个以上的标签?并且如果在xml中找不到输入标签名称,它应该会抛出警告消息并跳过该标签进行处理。 – chidori

+0

@chidori:您可以在'twig_handlers' hashref中使用尽可能多的表达式。对于警告,您可以在任何匹配项中增加计数器,并在最后检查其值以打印警告。试一下。 – Birei

+0

需要更改的数字标签完全取决于用户。所以有时它可能是一个,有时甚至多于一个。在当前脚本中,我们指定了要解析的标签数量'$ ARGV [0] => sub {$ _-> set_text($ ARGV [1])',但是当将要标记的数量编辑不固定,并且每次他运行脚本时都是用户选择的。 – chidori

相关问题