2014-12-06 91 views
-1

我是XML::Twig的新手。我想要更改所有<product>元素的屬性順序,如下所示。如何使用Perl和XML更改XML元素的屬性順序:: Twig

Input.xml中

<?xml version="1.0" encoding="utf-8"?> 
<root> 
    <product markup="xml" type="books" id="book1"> 
    <name>Analysis</name> 
    <prize>$203</prize> 
    <subject>Construct</subject> 
    </product> 
    <product markup="xml" type="books" id="book2"> 
    <name>Analysis</name> 
    <prize>$203</prize> 
    <subject>Bio</subject> 
    </product> 
</root> 

我需要這樣的

<?xml version="1.0" encoding="utf-8"?> 
<root> 
    <product id="book1" markup="xml" type="books"> 
    <name>Analysis</name> 
    <prize>$203</prize> 
    <subject>Construct</subject> 
    </product> 
    <product id="book2" markup="xml" type="books"> 
    <name>Analysis</name> 
    <prize>$203</prize> 
    <subject>Bio</subject> 
    </product> 
</root> 

我的代碼是:

use XML::Twig; 

my $XML = XML::Twig->new(
    twig_handlers => { 
    #'product' => sub {$_}, 
    # (I don't know this process) 
    }, 
    pretty_print => 'record', 
    output_encoding => 'utf-8', 
    keep_atts_order => 1, 
); 

$XML->parsefile("input.xml"); 

$XML->purge; 

我該如何改變呢?

+1

這似乎是一個奇怪的要求。請你解釋一下爲什麼你要重新排序? [XML 1.0規範](http://www.w3.org/TR/REC-xml/)明確指出屬性的順序並不重要。 – Borodin 2014-12-06 06:10:26

回答

1

正如在評論中提到的,這是一個奇怪的請求。你可能試圖做錯誤的方式(或者你正在使用不完全實現XML的工具)。

在任何情況下,由於XML ::嫩枝默認輸出屬性按字母順序排列,並按字母順序idmarkup之前,type之前該來的時候,它看起來像你沒有做任何事情。刪除keep_atts_order選項,讀取和寫入文件,voilà!我懷疑大多數其他XML工具也會以這種方式行事。

+0

我認爲要求是對屬性的順序有一些*控制*。建議詞典順序滿足這種特定需求並不構成解決方案。如果'XML :: Twig'困擾排序屬性標識符,並且非常懷疑*「大多數其他XML工具將以這種方式運行」,我也感到驚訝。 – Borodin 2014-12-06 06:28:08

+1

可預見的順序是好的,它避免不必要地更改文件。最初的要求對我來說不是很清楚,所以有一個重大的變化,實際上它是按字母順序對屬性進行排序。我們將看到OP對此有何評論。 – mirod 2014-12-06 06:30:18