使用 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类可以执行恶意代码的原理
java ViewPager实现Gallery效果。主要依靠设置clipChildren属性和ViewPager.Transformer接口实现