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

2022-09-04 23:58:48

我有以下代码:

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。如何安全/正确地解析它?


答案 1

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

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

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

如果文档中根本没有实体,则在处理之前将 正则表达式替换为 将 执行该操作。但是,如果他们正确发送了一些实体,则需要从匹配中排除这些实体。在他们实际上想要发送实体代码(即已发送但意味着)的极少数情况下,您将完全不走运。&&amp;&amp;&amp;amp;

但是,嘿 - 无论如何,这是供应商的错,如果你试图修复无效输入并不完全是他们想要的,那么他们可以做一件简单的事情来解决这个问题。:-)


答案 2

您的输入 XML 不是有效的 XML;不幸的是,你不能现实地使用XML解析器来解析它。

在将文本传递到 XML 分析器之前,您需要对其进行预处理。虽然你可以做一个字符串替换,用 替换,这不会捕获输入中出现的每个事件,但你可以想出一些可以做到的东西。'& ''&amp; '&


推荐