Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么XML::LibXML::Document';s toString()给我;标量(…)”;而不是XML字符串?_Xml_Perl_Xml Libxml - Fatal编程技术网

为什么XML::LibXML::Document';s toString()给我;标量(…)”;而不是XML字符串?

为什么XML::LibXML::Document';s toString()给我;标量(…)”;而不是XML字符串?,xml,perl,xml-libxml,Xml,Perl,Xml Libxml,下面是一个代码示例,它再现了我想知道的行为: #!/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 = $myXM

下面是一个代码示例,它再现了我想知道的行为:

#!/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)
我知道这是传递给用户的文档结构的某种句柄

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


我可能对
XML::LibXML
非常幼稚;这是我第一次使用它,而不是用Bash的echo输出随机的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的模块。它允许简洁的代码,并且因为它构建了一个适当的XML数据树,而不是仅仅将文本附加到缓冲区,所以它比看起来要微妙得多。对于更复杂的结构,有一个

\u 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>

这是一个基本的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的模块。它允许简洁的代码,并且因为它构建了一个适当的XML数据树,而不是仅仅将文本附加到缓冲区,所以它比看起来要微妙得多。对于更复杂的结构,有一个

\u 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>


谢谢-我将阅读有关引用、变量和函数扩展的内容。。。但我们的解决方案只走了一半:我现在得到了以下内容:
这实际上是我从实际脚本中得到的:良好的外部XML,但内部未扩展的内容。。。关于扩展,我缺少的另一件事是:现在的问题是,您错误地调用了模块方法。请参阅我答案的更新。我怀疑我对addChild和addNewChild感到困惑,但我无法指出这一点。。。所以这毕竟是一个XML::LibXML问题。我正在进行Openstreetmap数据导入,这消除了最后剩下的障碍之一。谢谢你!我正在生成的XML是以一种完全线性的方式生成的—因此XML:API的简单性对我来说很好,在我太习惯XML::LibXML之前,我将利用我的可塑性尝试一下—谢谢你的建议。为了读取Openstreetmap的OverpassAPI的XML输出,我使用了xpath表达式,它们工作得很好。我对前进感到兴奋!谢谢-我将阅读有关引用、变量和函数展开。。。但我们的解决方案只走了一半:我现在得到了以下内容:
这实际上是我从实际脚本中得到的:良好的外部XML,但内部未扩展的内容。。。关于扩展,我缺少的另一件事是:现在的问题是,您错误地调用了模块方法。请参阅我答案的更新。我怀疑我对addChild和addNewChild感到困惑,但我无法指出这一点。。。所以这毕竟是一个XML::LibXML问题。我正在进行Openstreetmap数据导入,这消除了最后剩下的障碍之一。谢谢你!我正在生成的XML是以一种完全线性的方式生成的—因此XML:API的简单性对我来说很好,在我太习惯XML::LibXML之前,我将利用我的可塑性尝试一下—谢谢你的建议。为了读取Openstreetmap的OverpassAPI的XML输出,我使用了xpath表达式,它们工作得很好。我对前进感到兴奋!