2010-07-01 72 views
4

是否有任何方法使用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(); 

感谢。

回答

3

您可能要考虑将两个旧的和新的XML文件,以规范的XML - 将它们与例如比较之前 - http://en.wikipedia.org/wiki/Canonical_XML差异。

詹姆斯·克拉克有一个小型的Java程序对http://www.jclark.com/xml/

+0

问题在于XML文件是以我们使用的设计程序以这种格式输出的,所以它们正在通过手动和此程序进行修改,现在也是我的脚本。所以我们必须每次都通过Canonical XML转换器来运行它们,对吧? 这仍然看起来很有用 - 我将更多地考虑它并将您标记为已接受的答案 - 谢谢! – 2010-07-02 13:31:45

+0

是的。复制每个文件,每次在每个副本上执行此操作,然后进行实际比较。如果我曾经见过一个脚本,那么这是一个优秀的脚本编辑人员 – 2010-07-02 14:27:08

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); 
    } 
} 
+0

好主意这样做,但这种令人吃惊不工作 - 与空文本节点仍然可以打印成''元素。 – 2010-07-02 13:28:35