将DOM解析器更改为不对空节点使用短符号

时间:2013-01-07 21:34:35

标签: java xml dom transformer

是否有将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 个答案:

答案 0 :(得分:2)

嗯,这是一个猜测:在变换器上将输出属性设置为“html”可能会这样做,因为html无法识别短路空标签(我认为)。

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

注意:未经测试!

更新:

我刚刚确认它有效。这个片段:

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>

答案 1 :(得分:1)

我也有同样的问题。 这是获得该结果的功能。

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;
}