2

処理する xml ファイルがいくつかあります。サンプルファイルを以下に示します

  <DOC>
  <DOCNO>2431.eng</DOCNO>
  <TITLE>The Hot Springs of Baños del Inca near Cajamarca</TITLE>
  <DESCRIPTION>view of several pools with steaming water; people, houses and 
   trees behind it, and a mountain range in the distant background;</DESCRIPTION>
   <NOTES>Until 1532 the place was called Pulltumarca, before it was renamed to
   "Baños  del Inca" (baths of the Inka) with the arrival of the Spaniards . 
   Today, Baños del Inca is the most-visited therapeutic bath of Peru.</NOTES>
   <LOCATION>Cajamarca, Peru</LOCATION>
   </DOC>        

xmlread() matlab 関数を使用しているときに、次のエラーが発生します。

    [Fatal Error] 2431.eng:3:29: Invalid byte 2 of 4-byte UTF-8 sequence.
    ??? Java exception occurred:
    org.xml.sax.SAXParseException: Invalid byte 2 of 4-byte UTF-8 sequence.
    at org.apache.xerces.parsers.DOMParser.parse(Unknown Source)
    at org.apache.xerces.jaxp.DocumentBuilderImpl.parse(Unknown Source)
    at javax.xml.parsers.DocumentBuilder.parse(Unknown Source)

    Error in ==> xmlread at 98
    parseResult = p.parse(fileName);

この問題を回避する方法の提案はありますか?

4

1 に答える 1

2

投稿したサンプルは問題なく動作します。

エラー メッセージが示すように、実際のファイルが正しくエンコードされていないと思います。すべての可能なバイト シーケンスが有効な UTF-8 シーケンスであるとは限らないことに注意してください: http://en.wikipedia.org/wiki/UTF-8#Invalid_byte_sequences

確認する簡単な方法は、Firefox でファイルを開くことです。XML ファイルにエンコードの問題がある場合は、次のようなエラー メッセージが表示されます。

XML 解析エラー: 整形式ではありません


編集:

だから私はファイルを見ました:あなたの問題は、XMLパーサーが<?xml ... ?>宣言行のないファイルをUTF-8として扱うことですが、あなたのファイルはISO-8859-1(Latin 1)またはWindows-1252(CP- 1252) 代わりに。

たとえば、SAX パーサーは次のトークンでチョークしました: Baños. U+00F1であるこの文字「チルダ付きの n 文字」は、2 つのエンコーディングで異なる表現をしています。

  • ISO-8859-1 では、1 バイトで表されます: 0xF1
  • UTF-8 では、2 バイトで表されます: 0xC3 0xB1

UTF-8はASCIIとの下位互換性を保つように設計されていますが、文字ñは拡張 ASCII の範囲に分類され、UTF-8 ではすべて 2 バイト以上で表されます。

ñoそのため、Latin-1 as で格納された部分文字列11110001 01101111が UTF-8 エンコードされていると解釈されると、パーサーは最初のバイトを見て、それを形式の 4 バイト UTF-8 シーケンスの先頭として認識11110xxx 10xxxxxx 10xxxxxx 10xxxxxxします。しかし、明らかにその形式に従っていないため、エラーがスローされます。

org.xml.sax.SAXParseException: 4 バイトの UTF-8 シーケンスのバイト 2 が無効です。

要点:常に XML 宣言を使用してください。あなたの場合、すべてのファイルの先頭に次の行を追加します。

<?xml version="1.0" encoding="ISO-8859-1"?>

または、これらのファイルを生成するプログラムを変更して、上記の行を記述します。

この変更の後、MATLAB (または実際には Java) は XML ファイルを正しく読み取ることができるはずです。

>> doc = xmlread('2431.eng');
>> doc.saveXML([])
ans =
<?xml version="1.0" encoding="UTF-16"?>
<DOC>
<DOCNO>annotations/02/2431.eng</DOCNO>
<TITLE>The Hot Springs of Baños del Inca near Cajamarca</TITLE>
<DESCRIPTION>view of several pools with steaming water; people, houses and trees behind it, and a mountain range in the distant background;</DESCRIPTION>
<NOTES>Until 1532 the place was called Pulltumarca, before it was renamed to "Baños del Inca" (baths of the Inka) with the arrival of the Spaniards . Today, Baños del Inca is the most-visited therapeutic bath of Peru.</NOTES>
<LOCATION>Cajamarca, Peru</LOCATION>
<DATE>October 2002</DATE>
<IMAGE>images/02/2431.jpg</IMAGE>
<THUMBNAIL>thumbnails/02/2431.jpg</THUMBNAIL>
</DOC>

(注: MATLAB がファイルを読み取ると、内部で UTF-16 として再エンコードされるようです)

于 2013-08-26T20:51:58.303 に答える