0

私は外部の関係者から提供されたいくつかのXMLを解析していますが、それらを変更することは絶対にありません。これらの厄介なXMLには、CDATAセクション内にHTMLが含まれており、XML::Parserがそれらをチョークします。

CDATAを完全に削除する以外に、これを克服する方法はありますか?

編集:

元のエラーは「整形式ではありません(無効なトークン)」でした。

テストケースをすぐに投稿しなかったことをお詫びします。いくつかの調査の後、私は何らかの理由でCDATA内が有効なXMLである必要があると確信したので、この質問を投稿しました。

テストケースを実行してくれた@ikegamiと、そのような動作の非常に可能性が高く明白ではない理由(エンコーディングの不一致)について@mirodに感謝します。

答えとして以下に掲載されている本当の理由。

4

3 に答える 3

4

XML :: Parserは、適切なCDATAセクションでチョークしないようにする必要があります。基本的に、CDATA内に入るのは、文字データである場合を除いて]]>、ランダムなバイナリがないことを意味します。これは、あなたのケースではないようです。また、宣言されたものと互換性のないエンコーディングのデータはありません(明示的または暗黙的に) )ドキュメント用。ここで問題になる可能性があります。

ドキュメントにエンコーディング宣言がないという問題があったとしても、私は驚かないでしょう。そのため、パーサーによってUTF-8であると想定されますが、HTMLデータはlatin-1またはwindows-1252であり、 UTF-8として読み取られたときに無効な文字。

データによっては、エンコードをlatin1に強制できる場合があります。XMLデータ自体が特にUTF-8にない場合は、XML :: ParserオプションProtocolEncoding => 'ISO-8859-1'を使用するか、CDATA内のテキストのエンコードを変換する必要があります。セクション、事前解析。

設計上、XMLパーサーは、整形式でないXMLに遭遇すると停止することになっているため、別のパーサーを使用してもおそらく役に立たないことに注意してください。

于 2012-08-09T18:02:21.940 に答える
3

XML::ParserはCDATAブロックを完全に処理します。expatXML :: Parserまたは基盤となるライブラリを更新する必要があるかもしれません。あるいは、問題が他の場所にあるかもしれません。あなたは自分の問題を示さなかったので、わかりにくいです。

use strict;
use warnings;
use feature qw( say );

use Data::Dumper qw( Dumper );
use XML::Parser  qw( );

sub f {
   local $Data::Dumper::Indent = 0;
   local $Data::Dumper::Terse  = 1;
   local $Data::Dumper::Useqq  = 1;
   return Dumper($_[0]);
}

my $parser = XML::Parser->new(
   Handlers => {
      Start => sub { say "Start of $_[1]"; },
      End   => sub { say "End of $_[1]"; },
      Char  => sub { say "Char: " . f($_[1]); },
   },
);

$parser->parse(<<'__EOI__');
<root>
<![CDATA[
   <html>
   <foo>test > test</foo><br>
   </html>
]]>
</root>
__EOI__

Start of root
Char: "\n"
Char: "\n"
Char: "   <html>"
Char: "\n"
Char: "   <foo>test > test</foo><br>"
Char: "\n"
Char: "   </html>"
Char: "\n"
Char: "\n"
End of root
于 2012-08-09T17:59:12.707 に答える
0

XMLを最小化した後、これらのエラーの理由を追跡することができました。これは、垂直タブの特殊記号です。

クレイジー!

このスニペットでファイルを修正できました:

perl -CSDA -pe 'tr/\x00-\x08\x0B\x0C\x0E-\x19//d' bad.xml > good.xml
于 2012-08-10T15:00:44.873 に答える