这是一个代码示例,它重现了我想知道的行为:
#!/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。
答案 0 :(得分: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');
<强>更新强>
您可能需要考虑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>