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