在Java中解析XML文件时如何忽略内联DTD

时间:2012-04-21 08:56:33

标签: java xml sax dtd ignore

我在读取带有DTD声明的XML文件时遇到问题(外部声明已解决)。我正在使用SAX方法(javax.xml.parsers.SAXParser)。当没有DTD定义解析时,例如StartEement-Characters-StartElement-Characters-EndElement-Characters ......所以在Start或End元素之后立即调用了字符方法,这就是我需要的方法。当DTD在文件解析模式中时,更改为例如StartElement-StartElement-StartElement-Characters-EndEement-EndEement-EndEement。我需要在每个元素之后使用Characters方法。所以我问有没有办法阻止更改解析模式?

我的代码:

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);

我正在尝试解析link(我的保管箱上的链接)的XML文件。

1 个答案:

答案 0 :(得分:4)

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

这是规范对ignorableWhitespace()所说的内容:

  

验证解析器必须使用此方法报告每个块   元素内容中的空格(参见W3C XML 1.0 recommendation, section 2.10):非验证解析器也可以使用此方法   能够解析和使用内容模型。

换句话说,如果有DTD,如果你没有验证,那么 解析器是否报告仅限元素的空格 内容模型使用characters()回调或 ignorableWhitespace()回调。