繁体   English   中英

为什么XML :: LibXML :: Document的toString()给我“ SCALAR(…)”而不是XML字符串?

[英]Why does XML::LibXML::Document's toString() give me “SCALAR(…)” instead of an XML string?

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

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

这是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');

更新

您可能要考虑XML::API ,这是我编写 XML的首选模块。 它允许使用简洁的代码,并且由于它构建了正确的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>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM