Измените анализатор 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;
}