2012-07-03 89 views
2

我得到了與XML創建使用標準的Java對象一個相當嚴重的問題,我的代碼如下:XML創建轉換CR在HTML實體

//Generate DOM 
DOMSource source = this.generateDomDocument(params...); 

//WRITE XML FILE 
TransformerFactory transformerFactory = TransformerFactory.newInstance(); 
Transformer transformer = transformerFactory.newTransformer(); 

//Properties 
transformer.setOutputProperty(OutputKeys.DOCTYPE_SYSTEM, STRING_FIELD_DTD); 
transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "4"); 
transformer.setOutputProperty(OutputKeys.INDENT, "yes"); 

//Convert and write to disk 
transformer.transform(source, new StreamResult(
         new OutputStreamWriter(new FileOutputStream(fileName), "UTF-8"))); 

問題是,變壓器改造回車返回在
實體,我不應該在生成的XML中。這是一個例子,我有寫在幾種不同的語言的翻譯(這就是爲什麼我用UTF-8)的結果文件,它們都是一樣的,當它們包含CarriageReturns於文:

<content langID="EN"> 
        <desc> Test string&#13; 
do not copy.</desc> 

要清除的東西起來,這是我所期望的XML:

<content langID="EN"> 
        <desc> Test string 
do not copy.</desc> 

我擡頭一看這個問題對谷歌和這裏也有,但似乎沒有解決方案或替代方法。

+0

我不確定,我正確理解問題:輸入數據包含CR,並且XML輸出應該a)不包含它們?或者b)簡單地在那裏換行?或c)...? –

+0

輸入數據包含CR,XML輸出應該只是有一個換行符,而不是像 然後是CRLF。我用Notepad ++檢查了XML代碼,這就是我發現的。 – OverLex

回答

0

大量的工作之後,我發現了兩個解決方案,以我自己的問題,他們更變通比真正的解決方案:

解決方案1 ​​

創建擴展FilterOutputStream中的一類,並實施必要的方法寫上除了那些不需要的最終流(在上面的情況下的文件)中的每個字符,即&#13; 要寫入流只需添加過濾器:

StreamResult result = new StreamResult(
          new OutputStreamWriter(
           new XMLFilterOutputStream(
            new FileOutputStream(filename)),"UTF-8")); 
transformer.transform(source, result); 

解決方案2

在創建DOM樹剛逃出\ r字符(因此從原來的文字中刪除所有的回車):

String util = //original string data 

Element desc = doc.createElement("desc");     
Node text = doc.createTextNode((util!=null ? stringEscape(util).trim() : "")); 
desc.appendChild(text); 
externalElement.appendChild(desc); 

而且具有逃逸方法來完成這種方式:

private String stringEscape(String str){ 
    StringBuffer st = new StringBuffer(str); 
    for(int i=0; i < st.length();i++){ 
     String s = st.substring(i,i+1); 
     if("\r".equals(s)){ 
      st.replace(i,i+1,""); 
     } 
    } 
    return st.toString(); 
} 

我知道,它的可怕的,但工程。

正確的解決方案AFAIK應該訪問XALAN中的HTMLEntities文件並修改該文件,從而迫使變壓器省略一些實體。

+2

對於'stringEscape',它可能比'str.replaceAll(「\ r」,「」)''快得多。 – lapo