- ベストアンサー
HTMLタグのエスケープ文字をタグに戻す方法
JavaのBufferedReaderクラスを使用して HTMLファイルを1行ずつ読み込んでまた、別のファイルに出力したところ HTMLファイル内では <br /> と表示されているところが出力ファイルでは <br /> というようにエスケープ文字で出力されてしまいました。 タグをそのまま出力したいのですがエスケープ文字で出力されないようにするためには どのようにすればよろしいでしょうか。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
XMLのテキストノードとして出力するなら、&<>"'が実態参照に置き換えられるのは正常です。 むしろ、置き換えないと、不正なXML文書になります。 それとも<br />タグの部分をエレメントとして出力したいのでしょうか?
その他の回答 (3)
- satomi3951
- ベストアンサー率71% (98/137)
入力はBufferedReaderとありますが、 出力には何を使っているのでしょうか? HTMLの本文として<br />があるのでしたら、 実体参照になっているのは元々ではありませんか? 実体参照にエスケープされているのを元に戻すライブラリ(参考URL参照)もありますが、 そもそも読み込んだまま出力しているなら、エスケープされないはずです。
補足
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); } }
- yamada_g
- ベストアンサー率68% (258/374)
自分でエスケープ処理をしていないのに勝手にエスケープされることなんてあるのでしょうか。 現象を再現できる最小限のファイルの内容とコードを提示できますか?
お礼
御回答ありがとうございます。遅くなりましたが、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); } }
補足
ご回答ありがとうございます。 今、提示できる環境にありませんので明日までには提示したいと思います。
- askaaska
- ベストアンサー率35% (1455/4149)
String.replaceAllとかで置換すればいいわ
お礼
ご回答ありがとうございます。 何かJavaのメソッドをかましたりライブラリを使用して 一発で変換できたら便利かなと思いましたので質問してみました。
補足
ご回答ありがとうございます。 <br />の部分はエレメントとしてではなく エレメントにはさまれた値として、 すなわちテキストノードとして出力したかったわけです。 置き換わるのは正常なんですね。 すっきりしました。どうもありがとうございました。