0

这是一个重现我想知道的行为的代码示例:

#!/usr/bin/perl
use strict;
use warnings;

use XML::LibXML;

my $myXMLdocument = XML::LibXML::Document->new();

my $myXML = $myXMLdocument->createElement("myXML");
$myXMLdocument->addChild($myXML);

my $element = $myXMLdocument->createElement("element");
$myXML->addChild($element);

my $node = $myXMLdocument->createElement("node");
$element->addNewChild('', $node);
$node->addNewChild('', $myXMLdocument->createAttribute( "key" => "value"));

print "$myXMLdocument->toString(2)\n";

输出 :

XML::LibXML::Document=SCALAR(0x8f5a6f8)->toString(2)

我知道这是对传递的文档结构的某种句柄XML::LibXML

现在为什么不toString将其序列化为人类可读的 XML?

我可能非常天真XML::LibXML;这是我第一次使用它,而不是使用 Bash 的回声随机生成 XML。

4

1 回答 1

4

这是一个基本的 Perl 问题,与XML::LibXML. Perl 在带引号的字符串中扩展简单变量,但不扩展函数调用。如果您将代码更改为

print $myXMLdocument->toString(2), "\n";

然后你会得到你需要的结果。


更新

您使用该模块略有错误。这些线

my $node = $myXMLdocument->createElement("node");
$element->addNewChild('', $node);
$node->addNewChild('', $myXMLdocument->createAttribute( "key" => "value"));

创建一个新元素$node,然后调用addNewChild将其添加到$element. 但是addNewChild将标签名称作为其第二个参数,因此 Perl 将$node对象字符串化以给出您所看到的奇怪标签名称。相反,你需要

my $node = $myXMLdocument->createElement('node');
$element->addChild($node);
$node->addChild($myXMLdocument->createAttribute(key => 'value'));

或者你可以坚持addNewChild

my $node = $element->addNewChild('', 'node');
$node->setAttribute(key => 'value');

更新

您可能想考虑哪个是我编写XMLXML::API的首选模块。它允许简洁的代码,并且因为它构建了一个适当的 XML 数据树而不是仅仅将文本附加到缓冲区,所以它比看起来要微妙得多。对于更复杂的结构,有一种方法可以让您返回树中的节点并添加更多数据。_goto

use strict;
use warnings;

use XML::API;

my $xml = XML::API->new;
$xml->myXML_open;
$xml->element_open;
$xml->node({ key => 'value' });
$xml->element_close;
$xml->myXML_close;

print $xml;

输出

<?xml version="1.0" encoding="UTF-8" ?>
<myXML>
  <element>
    <node key="value" />
  </element>
</myXML>
于 2013-02-19T10:30:18.767 回答