2016-09-13 81 views
0

我需要將CSV轉換爲XML然後轉換爲OutputStream。規則是在我的代碼中將"轉換爲"在Java中正確的xml轉義

輸入CSV行:

{"Test":"Value"} 

預期輸出:

<root> 
<child>{&quot;Test&quot;:&quot;Value&quot;}</child> 
<root> 

電流輸出:

<root> 
<child>{&amp;quot;Test&amp;quot;:&amp;quot;Value&amp;quot;}</child> 
<root> 

代碼:

File file = new File(FilePath); 
BufferedReader reader = null; 

DocumentBuilderFactory domFactory = DocumentBuilderFactory.newInstance(); 
DocumentBuilder domBuilder = domFactory.newDocumentBuilder(); 

Document newDoc = domBuilder.newDocument(); 
Element rootElement = newDoc.createElement("root"); 
newDoc.appendChild(rootElement); 

reader = new BufferedReader(new FileReader(file)); 
String text = null; 

    while ((text = reader.readLine()) != null) { 
      Element rowElement = newDoc.createElement("child"); 
      rootElement.appendChild(rowElement); 
      text = StringEscapeUtils.escapeXml(text); 
      rowElement.setTextContent(text); 
      } 

ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); 
Source xmlSource = new DOMSource(newDoc); 
Result outputTarget = new StreamResult(outputStream); 
TransformerFactory.newInstance().newTransformer().transform(xmlSource, outputTarget); 
System.out.println(new String(baos.toByteArray())) 

你能幫忙嗎?我想念什麼時候&轉換爲&amp;

+0

你是雙重逃跑。 DOM會爲你逃脫,但你也逃脫了。刪除對'StringEscapeUtils.escapeXml(文本)'的調用。 – Andreas

+0

我已閱讀關於此。奇怪的是,在消除逃跑後,根本沒有逃跑。 – user3305630

+0

因爲你只需要在''''引用的值的屬性中跳過''''''''這是有效的XML:''。 ''''''''''''''''''''''''''''''''''''''通常也總是被引用。 – Andreas

回答

1

XML庫將自動轉義需要XML轉義的字符串,因此您無需使用StringEscapeUtils.escapeXml手動轉義。只需將該行刪除,您應該得到正是您正在尋找的正確轉義的XML。

XML不需要"字符在任何地方都被轉義,只在屬性值內。因此,這是有效的XML已經:

<root> 
<child>{"Test":"Value"}</child> 
<root> 

你,如果你有包含報價的屬性,如逃避報價:<child attr="properly &quot;ed"/>

這是使用XML庫的主要原因之一:報價的微妙之處已經爲您處理。無需閱讀XML spec以確保您的報價規則正確無誤。

+0

我讀過這個。奇怪的是,在消除逃跑後,根本沒有逃跑。 – user3305630

+0

@ user3305630:根據您的評論更新了答案 –

+0

謝謝,這是非常正確的。 – user3305630