2009-08-03 4 views
7

私は完全なPerlのnewbですが、Perlの学習はawkのXML解析方法を理解するよりも簡単です。私は、このデータセットから.sgmファイルを解析したいと思います:Perl XML :: DOMモジュールを使用したパーサーエラー、「無効な文字番号への参照」

http://kdd.ics.uci.edu/databases/reuters21578/reuters21578.html

これは十年前からのニュースワイヤー〜20,000ロイターの記事のコレクションであり、テキスト処理、特定のタイプのための標準的なテストセットです。私のperlテストを簡略化するために、最初のファイルから最初の数百行を取得し、スクリプトが正しく機能するまでtest.sgmを作成しました。それはこのようにアウトを開始:

<!DOCTYPE lewis SYSTEM "lewis.dtd"> 
<REUTERS TOPICS="YES" LEWISSPLIT="TRAIN" CGISPLIT="TRAINING-SET" OLDID="5544" NEWID="1"> 
<DATE>26-FEB-1987 15:01:01.79</DATE> 
<TOPICS><D>cocoa</D></TOPICS> 
<PLACES><D>el-salvador</D><D>usa</D><D>uruguay</D></PLACES> 
<PEOPLE></PEOPLE> 
<ORGS></ORGS> 
<EXCHANGES></EXCHANGES> 
<COMPANIES></COMPANIES> 
<UNKNOWN> 
&#5;&#5;&#5;C T 
&#22;&#22;&#1;f0704&#31;reute 
u f BC-BAHIA-COCOA-REVIEW 02-26 0105</UNKNOWN> 
<TEXT>&#2; 
<TITLE>BAHIA COCOA REVIEW</TITLE> 
<DATELINE> SALVADOR, Feb 26 - </DATELINE><BODY>Showers continued throughout the week in 
the Bahia cocoa zone, alleviating the drought since early 
January and improving prospects for the coming temporao,... 

私は、一例としてhttp://www.xml.com/pub/a/2001/05/16/perlxml.htmlからperlスクリプトを使用し、これで終わった、extract.pl:

use XML::DOM; 

my $file = $ARGV[0]; 

my $parser = XML::DOM::Parser->new(); 
my $doc = $parser->parsefile($file); 

#print $doc->getElementsByTagName('DATE'); 

print "\n"; 

と私はこの出力を得る:

> perl extract.pl test.sgm 

reference to invalid character number at line 11, column 0, byte 343 at /usr/lib64/perl5/vendor_perl/5.8.5/x86_64-linux-thread-multi/XML/Parser.pm line 187 
> 

Googleが助けにならない(私は同じエラーが発生しているページがトップヒットと思われます)、Perlのハッカーの友人はまだVegasのBlackhatからハングアップしています。私が間違ってやっているアイデアや、ファイルをきれいにする方法は?私は、私が必要としていない「不明な」タグの中で悪いことが起こっていると思います。私は本当にすべての記事からテキストを抽出したいだけです。詳細が必要な場合はお知らせください。

答えて

7

数字の参照 "&#5;"有効なXMLドキュメントでは合法ではありません。

文字参照で参照される文字は、Charのプロダクションと一致しなければなりません。

今、私たちは、リンクをたどると見ればproduction for Char

シャア:: =#X9 | #xA | #xD | [#x20-#xD7FF] | [#xE000-#xFFFD] | [#x10000-#x10FFFF]

有効なXMLドキュメントで文字通り、数字の文字参照として表示されない文字がいくつかあります。

奇妙なことに、私は今日XMLについて何かを学んだ:)。

可能な回避策については、ASCII control characters in XMLでこの会話を参照してください。

+0

それでは。私は間違って何もしていないようだ。私はXMLを作成するのではなく、有用なものに無効な文字を使用しているわけではありません。 sed "s /&#/ bad/g" cleantest.sgm このトリックを行うようです。さて、「72行目の文書要素の後の迷惑行為」についてはまだ不平を言っていますが、それは無関係です。 私のためにそのXMLアーカイブを追跡してくれてありがとう。 – PlexLuthor

関連する問題