2014-03-01 30 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

相關問題