2012-03-27 46 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

相关问题