Scala Sax 解析器无法处理 <!DOCTYPE XML>

Posted

技术标签:

【中文标题】Scala Sax 解析器无法处理 <!DOCTYPE XML>【英文标题】:Scala Sax parser unable to process <!DOCTYPE XML> 【发布时间】:2017-08-15 09:16:46 【问题描述】:

我想解析从我无法控制的来源(特别是 Suunto 运动测试仪)获得的 XML 文件。当使用 scala XML.load() 加载它们时,它们加载得很好,但是我更喜欢 SAX (pull) 解析以获得更好的性能。然而,拉解析器似乎对文件头不满意。请参见以下示例:

import scala.io.Source
import scala.xml.pull.XMLEventReader
val text = """<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE xml>
<MovesCount MoveslinkVersion="1.2.41.0" TimeZone="60" >
 <Device sn="Quest_2596420792" >
  <Model info="DEVICE;INT;R" >120</Model>
  <Name info="DEVICE;TEXT;R" >Quest</Name>
  <FullName info="DEVICE;TEXT;R" >Suunto Quest</FullName>
  <SerialNumber info="DEVICE;INT;R" >2596420792</SerialNumber>
  </Device>
</MovesCount>"""

val src = Source.fromString(text)

for (ev <- new XMLEventReader(src)) 
  println(ev)

这会在解析时打印错误:

:2:14: 需要空格

当我删除包含DOCTYPE 的行或将其更改为&lt;!DOCTYPE xml &gt; 时,错误消失并且文件解析正常。

这是 xml pull 解析器中的错误吗?如果是,是否有一些可能的解决方法? XML 来自我无法控制的外部来源。

【问题讨论】:

【参考方案1】:

在尝试了另一个解析器 (Aalto XML) 之后,我认为该文档的格式确实非常糟糕,需要在将其输入解析器之前对其进行修复。我的解决方法是在使用PushbackInputStream 转换输入流时跳过 DOC 类型标头。

【讨论】:

以上是关于Scala Sax 解析器无法处理 <!DOCTYPE XML>的主要内容,如果未能解决你的问题,请参考以下文章

在 JAVA 中使用 SAX 解析器从 XML 文件中提取文本节点

使用 Sax Parser、Java 处理 XML 中的空标签

用于非常大的 XML 文件的 SAX 解析器

使用 SAX 解析器解析 Xml

在BlackBerry中使用SAX解析器解析XML

如何使用 SAX 解析器在 XML 中添加元素?