1

結果の XML で自己終了ノードが出力されないように、XML フラグメントを正規化しようとしています。(消費システムの制約により、ノード<test />をストリーミングしたい)。<test></test>

XML::LibXML::Node で toStringC14N() メソッドを使用して同じことを達成しようとしましたが、次のエラーが発生し、Google からも助けが得られないようです。

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 を呼び出します。おそらく、toStringC14N に関してラウンドトリップできない createDocument に関する何かがあるのでしょう。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 に答える