我正在尝试对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()"似乎很好用。
我使用的是perlv5.8版&XML::LibXML版本1.88
XML::LibXML的测试脚本t/24c14n.t中的所有单元测试都从$parser->parse_string中获取$doc并调用它的StringC14N。也许createDocument的某些内容对于StringC14N来说是不可往返的。您可以尝试询问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相关的其他问题,您可以使用perlXML邮件列表(perl-xml@listserv.ActiveState.com),其中讨论了大多数与XML相关的Perl模块。如果出现问题你应该先检查一下这份名单的档案。许多问题已经在那里讨论过了。您可以找到列表的档案上的订阅选项http://aspn.activestate.com/ASPN/Mail/Browse/Threaded/perl-xml.