2016-09-13 25 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(text)'への呼び出しを削除します。 – Andreas

+0

私はこれについてお読みしました。奇妙なことに、エスケープを取り除いた後、エスケープが全く起こらないということです。 – user3305630

+0

'' 'で引用された値を持つ属性で' ''をエスケープするだけでよいので、これは有効なXMLです: ''。 '>'は ']]'(CDATAターミネータ ']]>')のようにクォートする必要があるだけで、 '>'は常に ''と '&'の文字を引用符で囲む必要があります通常は常に引用されます。 – 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

関連する問題