簡體   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