【问题标题】:Writing XML according to a DTD根据 DTD 编写 XML
【发布时间】:2012-01-03 06:14:41
【问题描述】:

我想知道在 Java 中是否有一种方法(特别是 API)以类似 SAX 的方式(即类似事件的方式,不同于JDOM,我不能使用),它接受一个 DTD 并保证我的 XML 文档被正确编写。

我一直在使用 SAX 进行解析,并且我自己编写了一个 XML 编写器层,就好像我在编写一个普通文件一样(通过OutputStreamWriter),但我看到我的 XML 编写器层并不总是遵循 DTD 规则。

【问题讨论】:

    标签: java xml dtd


    【解决方案1】:

    SAX 不知道如何编写 XML 文档。有人参与解析它们。因此,您可以选择任何您想要创建文档的方法,然后使用 SAX API 针对 DTD 对其进行验证。

    顺便问一下,为什么要限制自己使用大约 10 年前几乎已经过时的工具?为什么不使用更高级别的 API 将对象转换为 XML,反之亦然?例如 JAXB。

    【讨论】:

    • 感谢您的回答!你让事情变得更清楚了。我使用 SAX 是因为我们的软件应该读取 XML 并保持较小的内存占用。由于我不习惯 XML 操作,我的开发团队建议使用 JDOM(我们的目的是“大”内存占用)和 SAX,我坚持使用。我将按照您的建议阅读有关 JAXB 和其他较新 API 的内容。再次感谢您!
    【解决方案2】:

    标准 DocumentBuilder 方法可以为您验证。

    这个sn-p取自http://www.edankert.com/validate.html#Validate_using_internal_DTD

    DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
    factory.setValidating(true);
    factory.setNamespaceAware(true);
    
    SchemaFactory schemaFactory = 
        SchemaFactory.newInstance("http://www.w3.org/2001/XMLSchema");
    
    factory.setSchema(schemaFactory.newSchema(
        new Source[] {new StreamSource("contacts.xsd")}));
    
    DocumentBuilder builder = factory.newDocumentBuilder();
    
    builder.setErrorHandler(new SimpleErrorHandler());
    
    Document document = builder.parse(new InputSource("document.xml"));
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-05-05
      • 2015-12-24
      • 1970-01-01
      • 2014-03-17
      • 2021-12-24
      • 2010-12-12
      • 1970-01-01
      相关资源
      最近更新 更多