我有以下代码:
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。我如何才能安全/正确地解析它?
发布于 2010-10-01 18:24:34
很简单,输入" XML“不是有效的XML。应对实体进行编码,即:
<Line1>Day & Night</Line1>基本上,除了告诉XML供应商他们正在给您提供垃圾并让他们修复它之外,没有其他“适当”的方法来解决这个问题。如果你处在一些可怕的情况下,你必须处理它,那么你采取的方法很可能取决于你期望收到的值的范围。
如果文档中根本没有实体,那么在处理之前用&替换&的正则表达式就可以解决这个问题。但是,如果它们正确发送了一些实体,则需要从匹配中排除这些实体。如果他们真的想发送实体代码(即发送的是&,但意思是&amp;),那么你就完全不走运了。
但是,嘿--无论如何这都是供应商的错,如果你试图修复无效输入并不是他们想要的,他们可以做一件简单的事情来解决这个问题。:-)
发布于 2010-10-01 18:26:23
您的输入XML不是有效的XML;不幸的是,您不能实际使用XML解析器来解析它。
在将文本传递给XML解析器之前,需要对文本进行预处理。虽然您可以进行字符串替换,将'& '替换为'& ',但这不会捕获输入中出现的所有&,但您可能会找到一些可以捕获的内容。
发布于 2012-10-22 17:07:03
在解析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))));
...一切都很好
https://stackoverflow.com/questions/3838316
复制相似问题