如何从Perl创建XML?

时间:2008-09-30 20:08:30

标签: xml perl

我需要在Perl中创建XML。根据我的阅读,XML::LibXML非常适合解析和使用来自其他地方的XML。有没有人对XML Writer有任何建议? XML::Writer仍然保持不变吗?有没有人喜欢/使用它?

除了功能完整性之外,我对一种易于使用的语法感兴趣,因此请在答案中描述您喜欢该模块的语法和任何其他原因。

请回答每个回答一个建议,如果有人已经回复了您的最爱,请将该回答投票。希望很容易看到最受欢迎的东西。

谢谢!

6 个答案:

答案 0 :(得分:30)

仅供记录,这是一个使用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>

答案 1 :(得分:21)

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>

答案 2 :(得分:10)

如果您想在Perl中使用数据结构并将其转换为XML,XML::Simple将很好地完成工作。

最简单的方法:

my $hashref = { foo => 'bar', baz => [ 1, 2, 3 ] };
use XML::Simple;
my $xml = XML::Simple::XMLout($hashref);

顾名思义,它的基本用法很简单;但是如果你需要的话,它确实提供了很多功能。

当然,它也可以轻松解析XML。

答案 3 :(得分:8)

我没有做太多的XML,但是XML::Smart看起来可能会做你想要的。请查看文档中的Creating XML Data部分,它看起来非常简单易用。

解释文档:

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>

冷却。我将不得不玩这个:)

答案 4 :(得分:3)

XML :: Smart看起来很不错,但我不记得多年前使用XML::Simple时它可用了。界面不错,适用于读写XML。

答案 5 :(得分:1)

我喜欢XML::TreeBuilder,因为它符合我的想法。从历史上看,我已经将它用于解析而不是发射。

在发布此问题几周后,我有机会从Perl生成一些XML。我调查了这里列出的其他模块,假设其中一个模块比XML :: TreeBuilder更好,但TreeBuilder仍然是我想要的最佳选择。

一个缺点是无法在XML :: TreeBuilder对象中表示处理指令和声明。