【问题标题】:How can I create XML from Perl?如何从 Perl 创建 XML?
【发布时间】:2023-03-10 04:13:01
【问题描述】:

我需要在 Perl 中创建 XML。根据我的阅读,XML::LibXML 非常适合解析和使用来自其他地方的 XML。有人对 XML Writer 有什么建议吗? XML::Writer 还在维护吗?有人喜欢/使用它吗?

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

请为每个答案提供一个建议,如果有人已经回答了您最喜欢的答案,请投票赞成该答案。希望很容易看出什么是最受欢迎的。

谢谢!

【问题讨论】:

    标签: xml perl


    【解决方案1】:

    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>
    

    【讨论】:

    • 谢谢,我确实查看了 XML::Writer 的文档。我希望有一种更简洁的语法,所以我会稍等片刻,看看是否有其他人提出任何建议,但如果这似乎是最喜欢的,那么我会接受它。
    • 语法“也许”早已存在,但 XML::Writer 为我服务了 8 年多。当需要从 Perl 创建 XML 时,它是我首先想到的。对于更“性感”的内容,请查看 XML::Class(但请注意,自 2005 年以来尚未更新)。
    • 回复。 “更简洁的语法”,上例中的“greeting”标签可以写成:$writer->dataElement("greeting", "Hello, world!", "class"=>"simple")。我看不出这会变得多么简单。
    • XML::Writer 得到维护——这也是我使用的。不幸的是,它仍然可以更好。据我所知,它不执行自封闭标签。另外,在编写标签后无法添加属性(它不是真正基于对象的)。
    【解决方案2】:

    我不会做太多 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>
    

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

    【讨论】:

      【解决方案3】:

      XML::Smart 看起来不错,但我不记得多年前使用XML::Simple 时它是否可用。界面不错,非常适合读写 XML。

      【讨论】:

        【解决方案4】:

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

        最简单的:

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

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

        自然也可以轻松解析XML。

        【讨论】:

          【解决方案5】:

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

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

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

          【讨论】:

          • 我同意你的观点,布赖恩。就我而言,我决定尝试编写 XML::LibXML,因为我正在更改的代码段已经在使用 XML::LibXML 来完成其他任务。
          • Brian 只是添加链接的编辑;我是发表评论的人。 :)
          【解决方案6】:

          为了记录,这里有一个使用 XML::LibXML 的 sn-p。

          #!/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>
          

          【讨论】:

          • 很好的例子 - 甚至 8 年后:)
          猜你喜欢
          • 1970-01-01
          • 2014-02-27
          • 2019-08-12
          • 2013-04-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多