2012-03-27 90 views
2

我使用XML::Twig從頭開始創建一個新的XML文檔。根元素應該有一個前綴和一個名稱空間聲明。所有的孩子也應該屬於這個名字空間並且使用這個前綴。如何使用包含名稱空間聲明和前綴名稱的XML :: Twig創建XML?

輸出應該是這樣的:

<?xml version="1.0" encoding="UTF-8" standalone="no"?> 
<abc:root xmlns:abc="http://www.somehost.com/abc-data/ns/5.0.0" version="5.0.0.0"> 
<abc:element name="myElement"> 
    This is my element 
</abc:element> 
</abc:root> 

我想這會看起來有點像這樣:

my $new_twig = XML::Twig->new(map_xmlns => {'http://www.somehost.com/abc-data/ns/5.0.0' => "abc"}, pretty_print => 'indented'); 

my $root = XML::Twig::Elt->new('root'); 
$new_twig->set_encoding('UTF-8'); 
$new_twig->set_standalone("no"); 
$new_twig->set_root($root); 

my $element = XML::Twig::Elt->new('element' => {'name'=>'myElement}; 
$element->set_text('This is my element'); 
$element->paste(last_child=>$root); 

# print in a file 
open (TMP, "> $new_file_name"); 
select TMP; 
$new_twig->print(\*TMP); 
close TMP; 

這看似簡單,但我仍然是一個牛逼到Perl和這讓我很難過! 感謝您的幫助!

回答

4

XML::Twig模塊更適合處理現有的XML,而不是從頭開始構建新的數據。您需要創建一個新的XML文檔是XML::Twig::Elt類:主要的XML::Twig類是不相關的。

構建XML文檔有很多方法。下面是創建您已作爲示例顯示了XML的例子

use strict; 
use warnings; 

use XML::Twig; 

my $new_file_name = 'new.xml'; 

my $root = XML::Twig::Elt->new('abc:root', { 
    'xmlns:abc' => "http://www.somehost.com/abc-data/ns/5.0.0", 
    version => "5.0.0.0", 
}); 
$root->insert_new_elt('abc:element' => {name => 'myElement'}, 'This is my element'); 
$root->set_pretty_print('indented'); 
$root->print_to_file($new_file_name); 

輸出

<abc:root version="5.0.0.0" xmlns:abc="http://www.somehost.com/abc-data/ns/5.0.0"> 
    <abc:element name="myElement">This is my element</abc:element> 
</abc:root> 

UPDATE

如果難以升級到最新版本XML::Twig,您可以通過將呼叫替換爲0123來實現等同效果與

open my $out, '>:utf8', $new_file_name or die qq(Cannot create "$filename": $!); 
$root->print($out); 
+0

感謝您的回答。這看起來不錯。不幸的是,它不運行,而是在twig_test.ipl第16行通過「XML :: Twig :: Elt」包找到對象方法「print_to_file」。 – Hoodlet 2012-03-27 11:50:20

+0

@Hoodlet - 已經添加了'print_to_file'方法在3.36版本 - 請參閱[更改文件](http://cpansearch.perl.org/src/MIROD/XML-Twig-3.39/Changes) – bvr 2012-03-27 13:25:32

+0

@Hoodlet:我已經添加到我的答案提供一個替代解決方案,只有一個早期版本的XML :: Twig可用。 – Borodin 2012-03-27 15:27:45

相關問題