【问题标题】:How to ignore inline DTD when parsing XML file in Java在 Java 中解析 XML 文件时如何忽略内联 DTD
【发布时间】:2021-08-11 20:34:59
【问题描述】:

我在读取带有 DTD 声明的 XML 文件时遇到问题(外部声明已解决)。我正在使用 SAX 方法 (javax.xml.parsers.SAXParser)。当没有 DTD 定义解析时,例如 StartEement-Characters-StartElement-Characters-EndElement-Characters...... 所以在 Start 或 End 元素之后立即调用了 characters 方法,这就是我需要的方式。当 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);

我正在尝试解析 XML 文件 link(它在我的 Dropbox 上的链接)。

【问题讨论】:

    标签: java xml sax dtd


    【解决方案1】:

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

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

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

    换句话说,如果存在 DTD,并且您没有进行验证,那么 是否仅在元素中报告空格取决于解析器 使用 characters() 回调或 ignorableWhitespace() 回调。

    【讨论】:

      猜你喜欢
      • 2023-03-22
      • 1970-01-01
      • 2018-12-05
      • 1970-01-01
      • 2016-02-04
      • 1970-01-01
      • 1970-01-01
      • 2014-12-11
      • 2019-06-09
      相关资源
      最近更新 更多