打印空XML元素作为开始标记,关闭标记
问题描述:
是否有任何方法使用org.w3c.dom打印空元素,如<tag></tag>
而不是<tag />
?我正在修改需要与旧版本进行比较的XML文件以供审阅。打印空XML元素作为开始标记,关闭标记
如果有帮助,将XML写入文件的代码:
TransformerFactory t = TransformerFactory.newInstance();
Transformer transformer = t.newTransformer();
DOMSource source = new DOMSource(doc);
StringWriter xml = new StringWriter();
StreamResult result = new StreamResult(xml);
transformer.transform(source, result);
File f = new File("output.xml");
FileWriter writer = new FileWriter(f);
BufferedWriter out = new BufferedWriter(writer);
out.write(xml.toString());
out.close();
感谢。
答
您可能要考虑将两个旧的和新的XML文件,以规范的XML - 将它们与例如比较之前 - http://en.wikipedia.org/wiki/Canonical_XML差异。
詹姆斯·克拉克有一个小型的Java程序对http://www.jclark.com/xml/
答
我假设空元素实际上是ELEMENT_NODE
s,文档中没有子元素。尝试向它们添加空的文本节点。这可能会诱使作者相信那里有一个文本节点,所以它会将它写出来,就好像有一个节点一样。但是文本节点不会输出任何内容,因为它是一个空字符串。
调用此方法与文档的两个参数应该做的伎俩:
private static void fillEmptyElementsWithEmptyTextNodes(
final Document doc, final Node root)
{
final NodeList children = root.getChildNodes();
if (root.getType() == Node.ELEMENT_NODE &&
children.getLength() == 0)
{
root.appendChild(doc.createTextNode(""));
}
// Recurse to children.
for(int i = 0; i < children.getLength(); ++i)
{
final Node child = children.item(i);
fillEmptyElementsWithEmptyTextNodes(doc, child);
}
}
+0
好主意这样做,但这种令人吃惊不工作 - 与空文本节点仍然可以打印成''
问题在于XML文件是以我们使用的设计程序以这种格式输出的,所以它们正在通过手动和此程序进行修改,现在也是我的脚本。所以我们必须每次都通过Canonical XML转换器来运行它们,对吧? 这仍然看起来很有用 - 我将更多地考虑它并将您标记为已接受的答案 - 谢谢! – 2010-07-02 13:31:45
是的。复制每个文件,每次在每个副本上执行此操作,然后进行实际比较。如果我曾经见过一个脚本,那么这是一个优秀的脚本编辑人员 – 2010-07-02 14:27:08