2009-08-25 80 views
5

我有格式的XML文件:在Perl中,如何更改XML文件中的元素而不更改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> 

請指導如何做到這一點。

在此先感謝。

我想將輸出文件保存在同一個目錄中,如果可能的話使用相同的名稱。可能嗎?

+1

散列有什麼問題? – innaM 2009-08-25 11:55:39

+0

xml文件是一個配置文件,並且使用它的組件不能讀取散列文件。如果在創建文件後其格式發生更改,那麼組件也無法從配置文件中讀取該值。 – 2009-08-25 12:14:21

+1

XMLin - >處理內容 - > XMLout – innaM 2009-08-25 13:00:18

回答

4

XML::Simple具有允許您指定如何選擇輸入將被改造成一個Perl的數據結構,該結構將如何輸出:

#!/usr/bin/perl 

use strict; 
use warnings; 

use XML::Simple; 

my $xml_file = 'b.xml'; 

my $xml = XMLin(
    $xml_file, 
    KeepRoot => 1, 
    ForceArray => 1, 
); 

$xml->{outer1}->[0]->{inner1}->[1]->{name} = 'Shane Bond'; 

XMLout(
    $xml, 
    KeepRoot => 1, 
    NoAttr => 1, 
    OutputFile => $xml_file, 
); 

XML::Simple沒有得到一點毛茸茸的,如果你做什麼有趣的東西,因爲它的目的不是要成爲一個通用的XML庫,但提供一個簡單的方法來處理用XML編寫配置文件。

CPAN有很多XML related modules。除非這是你必須處理的一次性問題,否則值得研究一些更強大和更適合的模塊。

+0

我希望將輸出文件保存在同一個目錄中,如果可能的話使用相同的名稱。可能嗎? – 2009-08-25 12:14:53

+0

@pchakraborty當然這是可能的。 Nifle甚至展示瞭如何去做。文檔清楚地解釋了'OutputFile'。偶爾閱讀:他們幫助。 – 2009-08-25 13:28:17

+0

我試過了,它的工作正常。我必須將它插入主代碼然後檢查結果。謝謝你的幫助。 – 2009-08-26 11:27:12

3

你試過XMLout with OutputFile

從文檔的XML ::簡單:

XMLout的默認行爲()是返回XML作爲一個字符串。如果您希望將XML寫入文件,只需使用'OutputFile'選項提供文件名即可。
此選項還接受一個I​​O處理對象 - 後輸出比使用UTF-8,例如,其他的編碼在Perl 5.8.0特別有用和:

open my $fh, '>:encoding(iso-8859-1)', $path or die "open($path): $!"; 
XMLout($ref, OutputFile => $fh); 
+0

我試過這個,它的工作正常。我必須將它插入主代碼然後檢查結果。謝謝你的幫助。 – 2009-08-26 11:29:30

8

當涉及到讀取或操作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_*'); 

NB。如果您不想保留備份文件,請刪除第二個參數('bak_ *')。

4

爲什麼要把它當作XML來處理呢?爲什麼不只是做一個正則表達式替換?

perl -pi -e 's/Shanebond/Shane Bond/' filename.xml 

這將做替換的地方,保持相同的文件名和一切。

相關問題