java - 如何在编写 XML 文件时忽略 DTD 验证但保留 Doctype?

标签 java xml dtd doctype

我正在开发一个系统,该系统应该能够读取任何(或至少任何格式正确的)XML 文件,操作一些节点并将它们写回到同一个文件中。我希望我的代码尽可能通用,但我不希望

  • 在我的代码中的任何位置硬编码引用架构/文档类型信息。文档类型信息在源文档中,我想准确保留该文档类型信息,而不是在我的代码中再次提供它。如果文档没有 DocType,我就不会添加。我根本不关心这些文件的形式或内容,除了我的几个节点。
  • 自定义 EntityResolvers 或 StreamFilters 以省略或以其他方式操纵源信息(令人遗憾的是,命名空间信息似乎无法从声明它的文档文件中访问,但我可以使用更丑陋的 XPath 来管理)
  • DTD 验证。我没有引用的 DTD,我不想包含它们,并且在不了解它们的情况下完全可以进行节点操作。

目标是让源文件除了通过 XPath 检索的更改节点外完全不变。我想摆脱标准的 javax.xml 东西。

到目前为止我的进步:

    DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();

    factory.setAttribute("http://xml.org/sax/features/namespaces", true);
    factory.setAttribute("http://xml.org/sax/features/validation", false);
    factory.setAttribute("http://apache.org/xml/features/nonvalidating/load-dtd-grammar", false);
    factory.setAttribute("http://apache.org/xml/features/nonvalidating/load-external-dtd", false);

    factory.setNamespaceAware(true);
    factory.setIgnoringElementContentWhitespace(false);
    factory.setIgnoringComments(false);
    factory.setValidating(false);
    DocumentBuilder builder = factory.newDocumentBuilder();
    Document document = builder.parse(new InputSource(inStream));

这会成功地将 XML 源加载到 org.w3c.dom.Document 中,忽略 DTD 验证。我可以进行替换,然后使用

    Source source = new DOMSource(document);
    Result result = new StreamResult(getOutputStream(getPath()));

    // Write the DOM document to the file
    Transformer xformer = TransformerFactory.newInstance().newTransformer();
    xformer.transform(source, result);

把它写回去。这几乎是完美的。但是 Doctype 标签不见了,不管我做什么。调试的时候看到解析后的Document对象中有一个DeferredDoctypeImpl [log4j:configuration: null]对象,但是不知为何错了,是空的还是被忽略了。我测试的文件开头是这样的(其他文件类型也是一样):

<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">

[...]

我认为有很多(简单?)方法涉及 hack 或将额外的 JAR 拉入项目。但我宁愿将它与我已经使用的工具一起使用。

最佳答案

抱歉,现在使用 XMLSerializer 而不是 Transformer 得到它...

关于java - 如何在编写 XML 文件时忽略 DTD 验证但保留 Doctype?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/582352/

相关文章:

java - 没有 XML Spring ApplicationContext

dtd - 在 DTD 中声明具有任意名称的元素

html - 内联样式没有发挥作用

java - urlrewrite.xml 配置文件中的语法错误

java - 测试 web 层 Spring Boot

java - Surfaceview - 以不同的 fps 以相同的速度围绕位图移动

java - 取消运行时权限请求?

java - 没有静态方法元工厂

java - 从 xml 中解析一些元素

java - 在 Java 中使用 XML : fluent XSD and no need to parse