我有以下代码:
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。我怎样才能安全/正确地解析这个?
答案 0 :(得分:35)
很简单,输入“XML”不是有效的XML。该实体应编码,即:
<Line1>Day & Night</Line1>
基本上,没有“正确”的方法来解决这个问题,除了告诉XML供应商他们给你垃圾并让他们来修复它。如果你处于某种可怕的情况,你只需处理它,那么你采取的方法可能取决于你期望得到的价值范围。
如果文档中根本没有实体,则在处理之前用&
替换&
可以解决问题。但如果他们正确地发送了一些实体,你需要从匹配中排除这些实体。并且他们实际上想要发送实体代码的罕见机会(即发送&
但意味着&amp;
),你将完全没有运气。
但是嘿 - 无论如何这都是供应商的错误,如果您尝试修复无效输入并不是他们想要的,那么他们可以采取一些简单的方法来解决这个问题。 : - )
答案 1 :(得分:5)
您的输入XML不是有效的XML;遗憾的是,您无法真实地使用XML解析器来解析它。
在将文本传递给XML解析器之前,您需要预处理文本。虽然您可以执行字符串替换,将'& '
替换为'& '
,但这不会捕获输入中每次出现的&
,但您可能会想出一些东西那样做。
答案 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+", "&");