[英]How can I create XML from Perl?
我需要在 Perl 中创建 XML。 根据我的阅读, XML::LibXML非常适合解析和使用来自其他地方的 XML。 有人对 XML Writer 有什么建议吗? XML::Writer是否仍在维护? 有人喜欢/使用它吗?
除了功能完整性之外,我还对易于使用的语法感兴趣,因此请在答案中描述语法和您喜欢该模块的任何其他原因。
请为每个答案提供一个建议,如果有人已经回答了您最喜欢的答案,请投票支持该答案。 希望很容易看出什么是最受欢迎的。
谢谢!
只是为了记录,这里有一个使用 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 %elements = (
color => 'blue',
metal => 'steel',
);
for my $name (keys %elements) {
my $tag = $doc->createElement($name);
my $value = $elements{$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>
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();
# produces <greeting class='simple'>Hello world!</greeting>
如果您想在 Perl 中采用数据结构并将其转换为 XML, XML::Simple将很好地完成这项工作。
最简单的:
my $hashref = { foo => 'bar', baz => [ 1, 2, 3 ] }; use XML::Simple; my $xml = XML::Simple::XMLout($hashref);
顾名思义,它的基本用法很简单; 但是,如果您需要,它确实提供了很多功能。
当然,它也可以轻松解析 XML。
编辑:我在今年 14 年前的 2008 年 10 月写了这篇文章。 从那以后情况发生了变化。 XML::Simple 自己的文档带有明确的警告:
强烈建议不要在新代码中使用此模块。 其他模块也可以提供更直接和一致的接口。 特别推荐使用XML::LibXML ,教程介绍可以参考。 XML::Twig是另一个很好的选择。
这些天来,我强烈建议检查这些而不是在新代码中使用 XML::Simple。
我没有做太多 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。
我喜欢XML::TreeBuilder因为它符合我的想法。 从历史上看,我更多地将它用于解析而不是发射。
这个问题发布几周后,我有机会从 Perl 生成一些 XML。 我调查了这里列出的其他模块,假设其中一个会比 XML::TreeBuilder 工作得更好,但 TreeBuilder 仍然是我想要的最佳选择。
一个缺点是无法在 XML::TreeBuilder 对象中表示处理指令和声明。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.