【问题标题】:Java - correctly indenting an XML made from multiple sourcesJava - 正确缩进由多个来源制成的 XML
【发布时间】:2021-10-16 13:35:11
【问题描述】:

我正在尝试正确缩进(缩进 = 2)由 Java Spring Boot 应用程序编写的 XML 文件。问题是我自己没有编写 XML,我是通过将各种源 XML 的各个部分与不同的模式连接起来来创建 XML。

我的代码是:

 TransformerFactory transformerFactory = TransformerFactory.newInstance();
  transformerFactory.setAttribute("indent-number", 2);
  Transformer transformer = transformerFactory.newTransformer();
  transformer.setOutputProperty(OutputKeys.INDENT, "yes");
  transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "2");
  
  transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");

  DOMSource source = new DOMSource(root.getOwnerDocument());

  StreamResult file = new StreamResult(outputFile);

  transformer.transform(source, file);

这似乎完全忽略了“缩进”参数:它只是复制原始 XML 文件中存在的任何缩进。

要复制节点,我都尝试了:

root.appendChild(document.adoptNode(extractedNodeToCopy.cloneNode(true)));

root.appendChild(document.importNode(extractedNodeToCopy, true));

但这并没有改变任何东西。

我没有收到错误消息,结果只是像原始文档一样缩进(所以每个标签都有不同的样式)。

【问题讨论】:

  • 缩进仅供人类阅读。因此,如果它对您很重要,请重新读取生成的文件,对其进行解析并创建一个带有适当缩进的新输出。
  • 您可以对任务使用 XSLT 转换。
  • 丑陋的事情是我实际上不知道结果文件中的内容,因此重新读取和正确解析它不是一种选择。在这种情况下,我将如何使用 XSLT 转换?

标签: java xml dom


【解决方案1】:

您已经在使用 XSLT。代码

transformerFactory.newTransformer()

使用执行“身份”转换的默认 XSL 模板实例化 XSLT 转换器(另请参见 https://docs.oracle.com/en/java/javase/11/docs/api/java.xml/javax/xml/transform/TransformerFactory.html#newTransformer()

所以在你的情况下,你可以修改缩进

  • 使用 java 准备 DOM 中的数据(存储在根目录中)。你将会拥有 根据您的喜好添加包含空格的 TextNode,或

  • 在样式表中做类似的工作(另见Problems Trying to Pretty Print XSLT Output)并通过调用来使用它

      transformerFactory.newTransformer(your stylesheet)
    

【讨论】:

    猜你喜欢
    • 2011-02-04
    • 1970-01-01
    • 2010-11-25
    • 1970-01-01
    • 2011-04-07
    • 1970-01-01
    相关资源
    最近更新 更多