繁体   English   中英

如何从 Perl 创建 XML?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM