我收到了一个“org.xml.sax.SAXParseException; lineNumber:4; columnNumber:26;实体”ldquo“已被引用,但未被声明。”读取XML文档时的异常。我正在阅读如下:
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
InputSource is = new InputSource(new StringReader(xmlBody));
Document document = builder.parse(is);
然后在builder.parse(is)上有一个例外; 从搜索开始,我认为有必要在外部声明一些新实体,遗憾的是,我无法修改原始的XML文档。
如何解决此问题?
由于
答案 0 :(得分:1)
从搜索开始,我认为有必要在外部声明一些新实体,遗憾的是,我无法修改原始的XML文档。
好吧,除非你声明实体,否则文档不是XML,你将无法使用XML解析器处理它。
当要求您处理不是格式良好的XML的输入时,最好的方法是修复创建文档的过程(使用XML进行交换的整个想法依赖于它是格式良好的XML)。替代方案是“修复”文档以将其转换为格式良好的XML(您说您不能这样做),或者忘记它本来是XML的事实,并将其视为任何专有的非-XML格式。
不是一个令人愉快的选择 - 但是当人们向XML提供口惠而不符合标准的字母时,这就是你所遇到的混乱。
答案 1 :(得分:0)
尝试
factory.setExpandEntityReferences(false);
这将阻止解析器尝试扩展实体。
编辑:这个http://xerces.apache.org/xerces2-j/features.html#dom.create-entity-ref-nodes怎么样 - 该页面的顶部有一个如何在底层解析器上设置功能的示例。这应该导致解析器创建实体引用DOM节点,而不是尝试扩展实体。