Измените анализатор DOM, чтобы не использовать короткие обозначения для пустых узлов

Есть ли способ изменить нотацию DOM Parser Empty с короткой формы на длинную?

я нуждаюсь

 <book></book>

вместо книги

<book/>

У нас есть сторонний читатель XML, который не будет работать с короткими обозначениями. Все мои объекты XML - DOM. Как лучше всего это сделать?

TransformerFactory transformerFactory = TransformerFactory.newInstance();
Transformer transformer = transformerFactory.newTransformer();
DOMSource source = new DOMSource(doc);
StreamResult result = new StreamResult(XMLFile);
transformer.transform(source, result);

Спасибо

2 ответа

Что ж, это предположение: установка выходного свойства "html" на преобразователе, вероятно, сделает это, поскольку html не распознает пустые теги короткого замыкания (я думаю).

transformer.setOutputProperty(OutputKeys.METHOD, "html");

NB: не проверено!

ОБНОВИТЬ:

Я только что проверил, что это работает. Этот фрагмент:

String xml = "<root><a/></root>";
Document doc = DocumentBuilderFactory.newInstance()
    .newDocumentBuilder()
    .parse(new ByteArrayInputStream(xml.getBytes()));
TransformerFactory tf = TransformerFactory.newInstance();
Transformer t = tf.newTransformer();
t.setOutputProperty(OutputKeys.METHOD, "html");
t.transform(new DOMSource(doc), new StreamResult(System.out));

производит этот вывод:

<root>
<a></a>
</root>

У меня такая же проблема. Это функция для получения этого результата.

public static String fixClosedTag(String rawXml){

    LinkedList<String[]> listTags = new LinkedList<String[]>(); 
    String splittato[] =  rawXml.split("<");

    String prettyXML="";

    int counter = 0;
    for(int x=0;x<splittato.length;x++){
        String tmpStr = splittato[x];
        int indiceEnd = tmpStr.indexOf("/>");
        if(indiceEnd>-1){
            String nameTag = tmpStr.substring(0, (indiceEnd));
            String oldTag = "<"+ nameTag +"/>";
            String newTag = "<"+ nameTag +"></"+ nameTag +">";
            String tag[]=new String [2];
            tag[0] = oldTag;
            tag[1] = newTag;
            listTags.add(tag);
        }
    }
    prettyXML = rawXml;

    for(int y=0;y<listTags.size();y++){
        String el[] = listTags.get(y);

        prettyXML = prettyXML.replaceAll(el[0],el[1]);
    }

    return prettyXML;
}
Другие вопросы по тегам