2015-03-03 68 views
1

我需要編輯一個xml文件wihich包含這樣幾行:XML ::簡單的輸出風格

<language name="en_US" title="sprint" subtitle="" url="sprint/en_US/index.html"> 

我的Perl腳本XML ::簡單的是工作的罰款期待i'n不能有輸出確切的這種格式。我得到:

<language> 
    <name>en_US</name> 
    <subtitle>My new subtitle</subtitle> 
    <title>sprint</title> 
    <url>sprint/en_US/index.html</url> 
</language> 

原則上這很好,但在這裏輸出文件與輸入文件使用差異。我可以強制XML :: Simple使用與輸入樣式相同的輸出樣式嗎? 我的代碼是: 使用XML :: Simple;

my $xml = XMLin(
    'a.xml', 
    KeepRoot => 1, 
    ForceArray => 1, 
); 

# editing xml 

XMLout(
    $xml, 
    KeepRoot => 1, 
    NoAttr => 1, 
    OutputFile => 'b.xml', 
); 

THX

+1

請勿使用XML :: Simple。 XML :: Simple用於簡單的XML,並沒有這樣的事情。改爲使用XML :: Trig。 http://shadow.cat/blog/matt-s-trout/mstpan-3/ – Quentin 2015-03-03 09:54:28

+0

你的目標輸出是什麼? – Sobrique 2015-03-03 09:55:01

+0

@Sobrique - 查看問題 – Quentin 2015-03-03 09:55:56

回答

2

第一關 - XML::Simple謊言。它不是,這是爲了簡單的XML。從它的文檔:

不鼓勵在新代碼中使用此模塊。其他模塊可提供更直接和一致的接口。

NoAttr這樣做是爲了你:

NoAttr => 1#在+出來 - 得心應手

當與XMLout(使用),將所生成的XML將不包含屬性。所有散列鍵/值將被表示爲嵌套元素。

與XMLin()一起使用時,XML中的任何屬性都將被忽略。

可能發現,在XMLin指定NoAttr會做你想要什麼?

不過,我會建議,而不是 - 使用XML::Twig

#!/usr/bin/perl 

use strict; 
use warnings; 

use XML::Twig; 

my $xml = 
    '<language name="en_US" title="sprint" subtitle="" url="sprint/en_US/index.html" />'; 

my $twig = XML::Twig->new->parse($xml); 

foreach my $key (keys %{ $twig->root->atts() }) { 
    print "$key => ", $twig->root->att($key), "\n"; 
} 

$twig->root->del_att('name'); 

print "With 'name' removed:\n"; 
$twig->root->print; 

如果你能給我多一點的輸入/輸出的樣本進行比較,我可以充實這個例子多一點。你可能不希望在這裏使用root,因爲這只是真正的'最高'元素 - 但考慮這個說明。你可以做一個foreach ($twig -> root -> children) {類型的迭代。

+0

枝條是我的解決方案。 =>非常感謝 – Pete 2015-03-05 07:14:15