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(拉丁 1)或Windows-1252(CP- 1252) 代替。

例如,SAX 解析器被以下标记阻塞:Baños. 这个字符“n letter with tilde”,即U+00F1,在两种编码中有不同的表示:

  • 在 ISO-8859-1 中,它表示为一个字节:0xF1
  • 在 UTF-8 中,它表示为两个字节:0xC3 0xB1

虽然UTF-8旨在向后兼容ASCII,但字符ñ属于扩展的 ASCII 范围,在 UTF-8 中都表示为两个或多个字节。

因此,当ñ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 回答