2013-01-07 22 views
1

是否有將DOM解析器空符號從短到長形式更改的方法?將DOM解析器更改爲不使用短符號表示空節點

我需要

<book></book> 

,而不是書

<book/> 

我們有一個不會與短notation.All我的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

您應該擔心您的第三方分析器不能接受哪些XML的其他部分。因爲可能有很多。 – parsifal

+0

同意@parsifal。您的解析器不符合規範。如果可能的話,解決這個問題會更好。如果沒有,你可能不得不後處理你的輸出。 –

+0

嗯,我認爲那是唯一的問題。 – user1088352

回答

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> 
+0

那麼這不起作用有沒有什麼辦法可以手動編寫Emppty元素。 – user1088352

+0

偉大的答案,一直在尋找一個簡單的解決方案,這個問題,偉大工程。 – Nathan

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; 
} 
相關問題