1

我正在尝试规范化 XML 片段以避免在生成的 XML 中打印自闭合节点。(由于消费系统的限制,我希望对节点<test />进行流式传输)。<test></test>

我尝试在 XML::LibXML::Node 中使用 toStringC14N() 方法来实现相同的目的,但我遇到了以下错误,我似乎也没有从谷歌那里得到任何帮助。

use XML::LibXML;

my $tagName  = 'testtag';
my $tagValue = '';

my $doc = XML::LibXML->createDocument->new('1.0', 'UTF-8');
my $element = $doc->createElement($tagName);
$element->appendText($tagValue);
print "\nOut=>".$element->toStringC14N();

输出:

Failed to convert doc to string in doc->toStringC14N at /usr/lib/perl5/site_perl/5.8.8/i386-linux-thread-multi/XML/LibXML.pm line 1328.

我只能追查错误,直到 LibXML.c 中的以下方法

xmlDocDumpMemory(self, &result, &len);

我对我做错了什么一无所知,因为“toString()”似乎工作正常。

我正在使用 perl v5.8.8 & XML::LibXML 1.88 版

4

1 回答 1

2

XML::LibXML 的测试脚本 t/24c14n.t 中的所有单元测试都从 $parser->parse_string 获取 $doc 并在其上调用 toStringC14N。也许 createDocument 的某些内容对于 toStringC14N 而言是不可往返的。您可以尝试在 XML::LibXML 邮件列表中询问(见下文)。

同时,这确实有效:

my $doc = XML::LibXML->createDocument->new('1.0', 'UTF-8');

my $element = $doc->createElement($tagName);
$element->appendText($tagValue);
my $doc2 = XML::LibXML->new->parse_string($element->toString);
print "\nOut=>".$doc2->toStringC14N()."\n";

#prints Out=><testtag></testtag>

对于建议等,以及与 XML::LibXML 相关的其他问题,您可以使用 perl XML 邮件列表 (perl-xml@listserv.ActiveState.com),其中讨论了大多数与 XML 相关的 Perl 模块。如果出现问题,您应该首先检查该列表的档案。那里已经讨论了许多问题。您可以在http://aspn.activestate.com/ASPN/Mail/Browse/Threaded/perl-xml找到列表的存档和订阅选项 。

于 2012-02-16T10:26:03.610 回答