プロが教える店舗&オフィスのセキュリティ対策術

JavaのBufferedReaderクラスを使用して
HTMLファイルを1行ずつ読み込んでまた、別のファイルに出力したところ
HTMLファイル内では <br /> と表示されているところが出力ファイルでは &lt;br /&gt;
というようにエスケープ文字で出力されてしまいました。
タグをそのまま出力したいのですがエスケープ文字で出力されないようにするためには
どのようにすればよろしいでしょうか。

A 回答 (4件)

XMLのテキストノードとして出力するなら、&<>"'が実態参照に置き換えられるのは正常です。


むしろ、置き換えないと、不正なXML文書になります。
それとも<br />タグの部分をエレメントとして出力したいのでしょうか?

この回答への補足

ご回答ありがとうございます。
<br />の部分はエレメントとしてではなく
エレメントにはさまれた値として、
すなわちテキストノードとして出力したかったわけです。
置き換わるのは正常なんですね。
すっきりしました。どうもありがとうございました。

補足日時:2011/10/16 13:27
    • good
    • 0

入力はBufferedReaderとありますが、


出力には何を使っているのでしょうか?

HTMLの本文として<br />があるのでしたら、
実体参照になっているのは元々ではありませんか?

実体参照にエスケープされているのを元に戻すライブラリ(参考URL参照)もありますが、
そもそも読み込んだまま出力しているなら、エスケープされないはずです。

参考URL:http://commons.apache.org/lang/api-release/org/a …

この回答への補足

htmlのファイルから内では<br /> が存在し、BufferedReaderで読み込んだ時点
でも<br />となっていることをEclipse上のデバッグモードで確認しています。
読み込んだHTMLの内容をXMLで出力しております。
下記のサンプルプログラムはBufferedReaderでHTMLを読み込む処理は
省略したものですがXML出力時に<br>,<a>のタグがエスケープ文字に
置き換えられることが確認できます。

public static void main(String[] args) throws Exception {

Document document = DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument();

Element elementEmployers = document.createElement("employers");
Element elementEmployer = document.createElement("employer");

Element elementEmployerName = document.createElement("name");
Text txtEmployerName = document.createTextNode("三浦 太郎");
elementEmployerName.appendChild(txtEmployerName);
elementEmployer.appendChild(elementEmployerName);

Element elementEmployerAge = document.createElement("age");
Text txtEmployAge = document.createTextNode("<br><a>>26</a>");
elementEmployerAge.appendChild(txtEmployAge);
elementEmployer.appendChild(elementEmployerAge);

elementEmployers.appendChild(elementEmployer);
document.appendChild(elementEmployers);


TransformerFactory transFactory = TransformerFactory.newInstance();

Transformer transformer = TransformerFactory.newInstance().newTransformer();
//インデントを行う
transformer.setOutputProperty(OutputKeys.INDENT, "yes");
transformer.setOutputProperty(OutputKeys.METHOD, "xml");
//インデントの文字数
transformer.setOutputProperty(OutputPropertiesFactory.S_KEY_INDENT_AMOUNT,"4");


DOMSource source = new DOMSource(document);
File newXML = new File("c:\\newXML.xml");
FileOutputStream os = new FileOutputStream(newXML);
StreamResult result = new StreamResult(os);
transformer.transform(source, result);
}

}

補足日時:2011/10/16 02:18
    • good
    • 0

自分でエスケープ処理をしていないのに勝手にエスケープされることなんてあるのでしょうか。


現象を再現できる最小限のファイルの内容とコードを提示できますか?

この回答への補足

ご回答ありがとうございます。
今、提示できる環境にありませんので明日までには提示したいと思います。

補足日時:2011/10/13 16:49
    • good
    • 0
この回答へのお礼

御回答ありがとうございます。遅くなりましたが、No.3さんの補足の
ところにも記載いたしましたが以下が現象を再現できる最小限のコードに
なります。XMLで出力するとエスケープ文字に置き換えられてしまいます。

public static void main(String[] args) throws Exception {

Document document = DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument();

Element elementEmployers = document.createElement("employers");
Element elementEmployer = document.createElement("employer");

Element elementEmployerName = document.createElement("name");
Text txtEmployerName = document.createTextNode("三浦 太郎");
elementEmployerName.appendChild(txtEmployerName);
elementEmployer.appendChild(elementEmployerName);

Element elementEmployerAge = document.createElement("age");
Text txtEmployAge = document.createTextNode("<br><a>>26</a>");
elementEmployerAge.appendChild(txtEmployAge);
elementEmployer.appendChild(elementEmployerAge);

elementEmployers.appendChild(elementEmployer);
document.appendChild(elementEmployers);


TransformerFactory transFactory = TransformerFactory.newInstance();

Transformer transformer = TransformerFactory.newInstance().newTransformer();
//インデントを行う
transformer.setOutputProperty(OutputKeys.INDENT, "yes");
transformer.setOutputProperty(OutputKeys.METHOD, "xml");
//インデントの文字数
transformer.setOutputProperty(OutputPropertiesFactory.S_KEY_INDENT_AMOUNT,"4");


DOMSource source = new DOMSource(document);
File newXML = new File("c:\\newXML.xml");
FileOutputStream os = new FileOutputStream(newXML);
StreamResult result = new StreamResult(os);
transformer.transform(source, result);
}

}

お礼日時:2011/10/16 02:21

String.replaceAllとかで置換すればいいわ

    • good
    • 1
この回答へのお礼

ご回答ありがとうございます。
何かJavaのメソッドをかましたりライブラリを使用して
一発で変換できたら便利かなと思いましたので質問してみました。

お礼日時:2011/10/13 13:21

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!