“&”的XML解析问题在元素文本中

时间:2010-10-01 10:22:33

标签: java xml parsing

我有以下代码:

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document document = builder.parse(new InputSource(new StringReader(inputXml)));

然后解析了解析步骤:

SAXParseException: The entity name must immediately follow 
                   the '&' in the entity reference

由于以下'&'在我的inputXml

<Line1>Day & Night</Line1>

我无法控制入站XML。我怎样才能安全/正确地解析这个?

4 个答案:

答案 0 :(得分:35)

很简单,输入“XML”不是有效的XML。该实体应编码,即:

<Line1>Day &amp; Night</Line1>

基本上,没有“正确”的方法来解决这个问题,除了告诉XML供应商他们给你垃圾并让他们来修复它。如果你处于某种可怕的情况,你只需处理它,那么你采取的方法可能取决于你期望得到的价值范围。

如果文档中根本没有实体,则在处理之前用&替换&amp;可以解决问题。但如果他们正确地发送了一些实体,你需要从匹配中排除这些实体。并且他们实际上想要发送实体代码的罕见机会(即发送&amp;但意味着&amp;amp;),你将完全没有运气。

但是嘿 - 无论如何这都是供应商的错误,如果您尝试修复无效输入并不是他们想要的,那么他们可以采取一些简单的方法来解决这个问题。 : - )

答案 1 :(得分:5)

您的输入XML不是有效的XML;遗憾的是,您无法真实地使用XML解析器来解析它。

在将文本传递给XML解析器之前,您需要预处理文本。虽然您可以执行字符串替换,将'& '替换为'&amp; ',但这不会捕获输入中每次出现的&,但您可能会想出一些东西那样做。

答案 2 :(得分:4)

我在xml解析之前使用了Tidy框架

final StringWriter errorMessages = new StringWriter();
final String res = new TidyChecker().doCheck(html, errorMessages);
...
DocumentBuilder db = DocumentBuilderFactory.newInstance().newDocumentBuilder();
Document doc = db.parse(new InputSource(new StringReader(addRoot(html))));  
...

一切都好

答案 3 :(得分:3)

inputXML一个字符串?然后使用:

inputXML = inputXML.replaceAll("&\\s+", "&amp;");