如何在Java解析XML文件时忽略了内联DTD(How to ignore inline DTD w

2019-09-16 16:00发布

我有一个问题读取与DTD声明中(外部声明解决)一个XML文件。 我使用SAX方法(javax.xml.parsers.SAXParser中)。 当没有DTD定义解析看起来像例如StartEement字符,起始元素的字符,结束元素,人物......因此,有开始或结束元素,这就是我怎么需要它后马上打电话字符的方法。 当DTD是文件解析架构更改,例如起始元素,起始元素,起始元素的字符 - EndEement-EndEement-EndEement。 我需要每一个元素之后的字符的方法。 所以,我问的是有没有什么办法来防止解析架构的变化?

我的代码:

SAXParserFactory factory = SAXParserFactory.newInstance();   
factory.setValidating(false);  

SAXParser parser = factory.newSAXParser();
XMLReader reader = parser.getXMLReader(); 

reader.setFeature("http://xml.org/sax/features/validation", false);
reader.setFeature("http://apache.org/xml/features/nonvalidating/load-dtd-grammar", false);
reader.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", false);
reader.setFeature("http://xml.org/sax/features/external-general-entities", false);
reader.setFeature("http://xml.org/sax/features/external-parameter-entities", false);
reader.setFeature("http://xml.org/sax/features/use-entity-resolver2", false);   
reader.setFeature("http://apache.org/xml/features/validation/unparsed-entity-checking", false);
reader.setFeature("http://xml.org/sax/features/resolve-dtd-uris", false);
reader.setFeature("http://apache.org/xml/features/validation/dynamic", false);
reader.setFeature("http://apache.org/xml/features/validation/schema/augment-psvi", false);

reader.parse(input);

还有就是我试图解析XML文件的链接 (它在我的Dropbox的链接)。

Answer 1:

我怀疑先前报告给节点characters()回调现在被报告给ignorableWhitespace()回调。 最简单的解决方案可能是简单地调用characters()ignorableWhitespace()

这是规范不得不说的ignorableWhitespace()

验证解析器必须使用此方法来报告在元件内容中的空格的每个数据块(参见W3C XML 1.0推荐,2.10节 ):非验证解析器也可以使用这种方法,如果它们能够解析和使用内容模型的。

换句话说,如果有一个DTD,如果你不验证,那么它是由解析器是否报告使用唯一的元素,内容模型空白characters()回调或ignorableWhitespace()回调。



文章来源: How to ignore inline DTD when parsing XML file in Java