如何从Perl创建XML?

jaxagkaj  于 2022-11-15  发布在  Perl
关注(0)|答案(6)|浏览(182)

我需要用Perl创建XML。据我所知,XML::LibXML非常适合解析和使用来自其他地方的XML。有人对XML编写器有什么建议吗?XML::Writer还在维护吗?有人喜欢/使用它吗?
除了功能完整性之外,我还对易于使用的语法感兴趣,因此请在回答中描述语法以及您喜欢该模块的任何其他原因。
请对每个答案给出一个建议,如果有人已经回答了您最喜欢的答案,请为该答案投票。希望这样可以很容易地看到最受欢迎的答案。
谢谢你!

yacmzcpb

yacmzcpb1#

为了记录在案,这里有一个使用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>
vmjh9lq9

vmjh9lq92#

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>
kr98yfug

kr98yfug3#

如果您想将Perl中的数据结构转换为XML,XML::Simple可以很好地完成这项工作。
简单来说:

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

顾名思义,它的基本用法很简单;然而,它确实提供了很多功能,如果你需要的话。
当然,它也可以轻松地解析XML。
编辑:我在2008年10月写了这篇文章,也就是14年前的今年。从那时起,情况发生了变化。XML::Simple自己的文档中有一个明确的警告:
强烈建议不要在新代码中使用此模块。可以使用其他模块,这些模块提供了更直接和一致的接口。特别推荐使用XML::LibXML,您可以参考教程介绍。XML::Twig是另一个很好的选择。
现在,我强烈建议您在新代码中使用XML::Simple。

tyky79it

tyky79it4#

我不怎么做XML,但是XML::Smart看起来可以做你想做的事情。看一下文档中的创建XML数据一节,它看起来非常简单易用。
转述doc:

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>

酷。我将不得不玩这个:)

yks3o0rb

yks3o0rb5#

XML::Smart看起来不错,但我不记得很多年前我使用XML::Simple时它是可用的。不错的界面,对于阅读XML工作得很好。

kt06eoxx

kt06eoxx6#

我喜欢XML::TreeBuilder,因为它符合我的思维方式。
在这个问题发布几周后,我有机会从Perl生成一些XML。我调查了这里列出的其他模块,假设其中一个模块比XML::TreeBuilder更好地工作,但TreeBuilder仍然是我所需要的最佳选择。
一个缺点是无法在XML::TreeBuilder对象中表示处理指令和声明。

相关问题