2010-07-23 74 views
1

解析不正确生成的XML文档时,我得到这个错误:配置的Xerces SAX解析器容忍的XML语法错误

org.xml.sax.SAXParseException: The value of attribute "bar" associated with an element type "foo" must not contain the '<' character. 

我知道是什么原因造成的问题。这是这一行:

<foo bar="x<y">42</foo> 

应该已经

<foo bar="x&lt;y">42</foo> 

我知道,这不是有效的XML,但我的代码必须下载和分析类似的文件无人值守和出于政治原因,它可能不可能说服供应商修复有问题的程序,尤其是当其他程序正在读取文件并容忍此错误时。

有什么办法可以配置Xerces来容忍它吗?目前它将其视为致命错误。实现ErrorHandler忽略它是不令人满意的,因为然后文档的其余部分未被解析。

或者,你可以建议另一个可以配置为容忍这个错误的基于流的解析器吗?使用DOM解析器不可行,因为这些文档会运行到数百兆字节。

+2

这是一个政治问题。它需要政治解决方案,而不是技术方案。 – 2010-07-23 07:25:28

+1

Xerces可能不会容忍它,但是像jsoup这样的替代库(https://jsoup.org/)可能更适合这种情况。它看起来最初是为HTML设计的,但是我已经使用它来成功地从错误的XML中读取数据。 http://stackoverflow.com/questions/9886531/how-to-parse-xml-with-jsoup – 2016-10-17 21:43:30

回答

4

我不认为你会找到任何可以容忍这种错误的XML解析器。我可以建议的唯一事情就是预先处理XML以消除可能发生的错误。

+2

有关预处理的有趣之处,如果你想到它在所提供的示例中使用,那就是你需要理解各种XML上下文,如新节点的开始等。换句话说,一些基本的XML解析逻辑本身需要完成,它可以识别上下文中对XML编码的需求并应用它。看起来它会涉及像OP想要的那样编​​写一个“宽容”的XML解析器。 – 2010-07-23 10:46:39

+1

@Vineet。问题在于它不能以一般方式完成。预处理需要基于@ finnw关于供应商XML应该是什么样的知识,观察到的错误的系统化以及基于模式的匹配和纠正来完成。没有使用@ finnw的知识,可能会有很多可能的更正,并且没有办法让假设的容错解析器选择正确的解析器。 – 2010-07-23 12:15:02

+0

@Stephen,这就是为什么预处理不能成为一揽子解决方案的原因。可以使用正则表达式和其他方案来发现这些错误,但是如果它们是随机的并且可能出现在任何属性值或文本节点中,那么是什么? – 2010-07-23 12:21:15

5

...和出于政治原因,它可能无法说服供应商来修复错误程序......

出于政治原因,你应该尝试您damnedest让他们要解决这个问题。在他们面前提出需求规格说明输入必须是格式良好的XML。威胁要开发一个定制解析器的费用向他们收费。 (好吧,这可能不会起作用...)

放弃而不打架,你只是让问题麻烦其他人在未来不得不与这个供应商打交道。