我必须解析一些Java文件,这些文件有时候是无效的,它包含HTML实体,例如& mdash;& gt;等等。我理解正确的处理方法是在解析之前向XML文件添加适当的实体声明。但是,我无法做到这一点,因为我无法控制这些XML文件。
是否有某种回调,我可以覆盖在Java XML解析器遇到这样一个实体时被调用?我没有能够在API中找到一个。
我想用:
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder parser = dbf.newDocumentBuilder();
Document doc = parser.parse( stream );
我发现我可以在org.xml.sax.helpers.DefaultHandler中覆盖resolveEntity,但是如何使用更高级别的API?
这是一个完整的例子:
public class Main {
public static void main( String [] args ) throws Exception {
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder parser = dbf.newDocumentBuilder();
Document doc = parser.parse( new FileInputStream( "test.xml" ));
}
}
with test.xml:
Some text — invalid!
生产:
[Fatal Error] :3:20: The entity "nbsp" was referenced, but not declared.
Exception in thread "main" org.xml.sax.SAXParseException; lineNumber: 3; columnNumber: 20; The entity "nbsp" was referenced, but not declared.
更新:我一直在使用JDK源代码调试器,而男孩,有多少意大利面。我不知道设计在那里,还是有一个。只有几层洋葱可以在一层之上呢?
他们的关键类似乎是com.sun.org.apache.xerces.internal.impl.XMLEntityManager,但是我找不到任何可以让我在使用之前添加东西的代码,或尝试在不经过的情况下解析实体那个班。