如何从Perl创建XML?
我需要在Perl中创建XML。根据我的阅读,XML :: LibXML非常适合解析和使用来自其他地方的XML。有没有人对XML Writer有任何建议?是否仍然维护XML :: Writer?有人喜欢/使用它吗?
除了功能完整之外,我还对一种易于使用的语法感兴趣,因此,请在答案中描述该语法以及我们喜欢该模块的其他原因。
请为每个答案提出一个建议,如果有人已经回答了最爱,请对该答案进行投票。希望可以很容易地看到什么是最受欢迎的。
谢谢!
解决方案
XML :: Writer仍处于维护状态(至少到今年2月为止),它的确是那里最受欢迎的Perl XML编写器之一。
至于描述语法,最好查看模块的文档(链接已在问题中)。以机智:
use XML::Writer; my $writer = new XML::Writer(); # will write to stdout $writer->startTag("greeting", "class" => "simple"); $writer->characters("Hello, world!"); $writer->endTag("greeting"); $writer->end(); $output->close(); # produces <greeting class='simple'>Hello world!</greeting>
我没有做太多XML,但是XML :: Smart看起来可以满足要求。看一下文档中的"创建XML数据"部分,它看起来非常简单易用。
解释文档:
use XML::Smart; ## Create a null XML object: my $XML = XML::Smart->new() ; ## Add a server to the list: $XML->{server} = { os => 'Linux' , type => 'mandrake' , version => 8.9 , address => [ '192.168.3.201', '192.168.3.202' ] , } ; $XML->save('newfile.xml') ;
它将把它放在newfile.xml中:
<server os="Linux" type="mandrake" version="8.9"> <address>192.168.3.201</address> <address>192.168.3.202</address> </server>
凉爽的。我将不得不玩这个:)
XML :: Smart看起来不错,但是我不记得很多年前使用XML :: Simple时就可以使用它。美观的界面,非常适合读取和写入XML。
如果要在Perl中采用数据结构并将其转换为XML,则XML :: Simple可以很好地完成此工作。
最简单的说:
my $hashref = { foo => 'bar', baz => [ 1, 2, 3 ] }; use XML::Simple; my $xml = XML::Simple::XMLout($hashref);
顾名思义,它的基本用法很简单;但是,如果我们需要的话,它确实提供了许多功能。
自然,它也可以轻松解析XML。
我喜欢XML :: TreeBuilder,因为它符合我的想法。从历史上看,我将其更多地用于解析而不是发射。
发布此问题几周后,我有机会从Perl生成一些XML。我调查了这里列出的其他模块,假设其中一个模块比XML :: TreeBuilder更好,但是TreeBuilder仍然是我想要的最佳选择。
一个缺点是无法在XML :: TreeBuilder对象中表示处理指令和声明。
仅作记录,这是一个使用XML :: LibXML的代码段。
#!/usr/bin/env perl # # Create a simple XML document # use strict; use warnings; use XML::LibXML; my $doc = XML::LibXML::Document->new('1.0', 'utf-8'); my $root = $doc->createElement("my-root-element"); $root->setAttribute('some-attr'=> 'some-value'); my %tags = ( color => 'blue', metal => 'steel', ); for my $name (keys %tags) { my $tag = $doc->createElement($name); my $value = $tags{$name}; $tag->appendTextNode($value); $root->appendChild($tag); } $doc->setDocumentElement($root); print $doc->toString();
并输出:
<?xml version="1.0" encoding="utf-8"?> <my-root-element some-attr="some-value"> <color>blue</color> <metal>steel</metal> </my-root-element>