2010-07-01 2 views
4

Есть ли способ распечатать пустые элементы, такие как <tag></tag>, а не <tag />, используя org.w3c.dom? Я изменяю 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 каждый раз, не так ли? Это по-прежнему выглядит полезным - я собираюсь изучить его больше и отметить вас как принятый ответ - спасибо! –

+0

Да. Скопируйте каждый файл, сделайте это каждый раз на каждой копии, а затем сравните. Отличный кандидат на сценарий, если я когда-либо видел его :) –

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

Хорошая идея, но это удивительно не работы- элементы с пустыми текстовыми узлами до сих пор получить напечатанных как '' . –

Смежные вопросы