使用 Java DOM + Transformer 时省略 xml 声明中的独立属性。

Posted

技术标签:

【中文标题】使用 Java DOM + Transformer 时省略 xml 声明中的独立属性。【英文标题】:Omitting the standalone attribute in xml declaration when using Java DOM + Transformer. 【发布时间】:2010-12-13 13:24:27 【问题描述】:

有没有办法告诉 Transformer(当使用 DOM 序列化 XML 文档时)省略独立属性?

最好不使用 hack,即省略整个 XML 声明,然后手动添加它。

我当前的代码:

Transformer transformer = TransformerFactory.newInstance().newTransformer();
transformer.setOutputProperty(OutputKeys.INDENT, "yes");
transformer.setOutputProperty(OutputKeys.STANDALONE, "yes"); //Note nothing is changed

StreamResult result = new StreamResult(new StringWriter());
DOMSource source = new DOMSource(document);
transformer.transform(source, result);
 return result.getWriter().toString();

当前:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<someElement/>

目的:

<?xml version="1.0" encoding="UTF-8">
<someElement/>

【问题讨论】:

【参考方案1】:

想通了..

而不是改变变压器,

我将以下内容添加到文档对象中。

  document.setXmlStandalone(true);

【讨论】:

为什么它甚至可以工作?根据规范:w3.org/TR/2004/REC-xml-20040204/#sec-rmd“如果有外部标记声明但没有独立文档声明,则假定值为“no”。这个答案:***.com/questions/5578645/… 还指出,如果缺少独立属性,则假定为“否”。那怎么来 document.setXmlStandalone(true);删除属性?【参考方案2】:

document.setXmlStandalone(true/false); 工作正常。

【讨论】:

【参考方案3】:

您必须使用以下组合:

doc.setXmlStandalone(true);

transformer.setOutputProperty(OutputKeys.STANDALONE, "yes"); // this is used to show the standalone tag

【讨论】:

终于有一个有效的答案了! :D 目标是隐藏属性,上面的答案显示了属性。 @pkozuchowski 你是对的,但我的意思是我们需要设置两个选项才能使其正常工作。【参考方案4】:

您使用的是哪个 Java 版本和/或哪个 XSLT 转换器?在 Sun Java 1.6.0_16 中,如果您设置了 output 属性并且内容也正确,则只会在输出文档中设置独立属性。

【讨论】:

我在使用 Eclipse 4.5 (Mars) 的内置 Java 8 SE 时遇到了同样的问题。

以上是关于使用 Java DOM + Transformer 时省略 xml 声明中的独立属性。的主要内容,如果未能解决你的问题,请参考以下文章

javax.xml.transform.Transformer 的漂亮打印输出,仅使用标准 java api(缩进和 Doctype 定位)

使用 XSL 样式表 Java Transformer Factory 对 XMLTag 进行排序

java反序列化 - Transformer类可以执行恶意代码的原理

DOM方式创建XML文件

由于移动到 java 1.7 Xml 文档元素不缩进

java ViewPager实现Gallery效果。主要依靠设置clipChildren属性和ViewPager.Transformer接口实现