打印空XML元素作为开始标记,结束标记

时间:2010-07-01 21:17:14

标签: java xml

有没有办法使用org.w3c.dom打印<tag></tag>空元素而不是<tag />?我正在修改需要针对旧版本自己进行差异化的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();

感谢。

2 个答案:

答案 0 :(得分:3)

您可能需要考虑将旧XML文件和新XML文件转换为Canonical XML - http://en.wikipedia.org/wiki/Canonical_XML - 然后再将它们与例如分差

James Clark在http://www.jclark.com/xml/

上有一个小型Java程序

答案 1 :(得分:1)

我假设空元素实际上是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);
    }
}