Javaに関する様々な情報をご紹介します。

Javaに関する様々な情報をご紹介します。
評価

0

XMLに保存で改行の数が2倍になる

JAVA初心者です。
JAVAでXMLにデータを保存する掲示板を作成しています。
1)JSPで表示したFORMのtextareaに入力してServletにPost。
2)ServletはXMLに保存(Shift_JISで)して、JSPで結果表示依頼。
3)JSPでは投稿結果をtextareaに出力。
の動きにしている(3は最終的にはHTMLテキスト表示にする予定)のですが、ここまで作成してわからない点が有るためお教え下さい。

1)でtextareaに複数行入力すると、2)で作成されるXMLファイルに予期しないコードが出力され、3)で改行が2倍になってしまいます。

例)
1)で
------
1行目
2行目
3行目
------
と入力すると
3)で
------
1行目

2行目

3行目
------
と表示されます。

2)でのXML書き込み結果は
------
<e_content>1行目

2行目

3行目</e_content>
------
の様になっています。
テキストエディタで、"
"を削除した形に編集すると余分な改行は無くなって表示されます。
この予期しないコード "
" を無くして1)で入力したイメージでXML出力されるようにしたいのです。

環境は、
OS:XP(SP2)
JAVA:1.4.2_03
です。

宜しくお願いいたします。

4

回答

81900

閲覧

4件の回答

評価

0

文字コードは正しく設定されていますでしょうか。

JSPの方にはpageディレクティブでcontentTypeとpageEncodingの両方を指定した方が良いと思います。contentTypeはブラウザに表示するときの文字コード、pageEncodingはJSPがServletに変換されるときの文字コードです。

ServletでJSPからのPostデータを受け取る前にrequest.setCharacterEncoding("Shift_JIS");を実行していますでしょうか。setCharacterEncodingはJSPからPostされるデータを取得する際の文字コードです。

とりあえず思いつくのはこれくらいでしょうか。表示関連がおかしいとなると文字コードが一番怪しいと思うのですが・・。

あと、質問に書かれている「テキストエディタで、" "を削除した形に」の" "とは何のことなのでしょうか。

評価

0

早速のご教授有難うございます。

若干自分の書いたソースを忘れていた部分が有りました。
JSPの方のpageディレクティブに関してですが、JSPファイルは使用していませんでした。
Servletで、
--------------
TransformerFactory factory = TransformerFactory.newInstance();
Transformer transformer = factory.newTransformer(new(StreamSource(xslPath));
transformer.setOutputProperty("encoding","Shift_JIS");
transformer.transform(new StreamSource(xmlPath), new StreamResult(out));
--------------
として、XMLファイルをXSLファイルを介してHTML表現しています。
setOutputProperty()をコールしている事から、contentType、pageEncodingに関しては問題無いのかと思っていましたが、考え違いでしょうか。

>contentTypeはブラウザに表示するときの文字コード、pageEncodingはJSPがServletに変換されるときの文字コードです。

これ大変勉強になりました。覚えておきます。

Servletでrequest.setCharacterEncoding("Shift_JIS");は実行しています。

"   " の部分に付いてですが、文字が入力した通りに投稿されていませんでした。すみません。
投稿したかった内容は
--------------
<e_content>1行目*****
2行目*****
3行目</e_content>

 (***** 部は、
   &#13;
  の5文字を半角表現で投稿)
--------------
でした。
このXMLファイルに書かれる*****部5文字に付いて何か分かることは無いでしょうか?

宜しくお願いいたします。

評価

0

 少し調べてみましたら、XSLTの問題のような気がします。XML、XSLTはあまり詳しくないのですが、XSLTエンジンの中には&#13;を改行と認識するものがあるようです。

googleで検索すると以下のように書けば、見たいなのがありましたのでご参考にお知らせします。私はどういう意味なのかよくわかりません。
<xsl:value-of select="translate(text(), '&#13;', '')"/>

評価

0

いろいろ情報検索したのですが、適当なのが検索できないまま何とか対応できました。

DOMSource    source = new DOMSource(doc);
FileOutputStream  os = new FileOutputStream(new File(outFileNameXML));
StreamResult    result = new StreamResult(os);
transformer.transform(source, result);

でXMLファイルに書き込んでいましたが、以下のように変更
------------------------------
// XMLファイルの文字列化
DOMSource    source = new DOMSource(doc);
StringWriter    outWriter = new StringWriter();
StreamResult    result = new StreamResult(outWriter);
transformer.transform(source, result);
String    xml_str = outWriter.toString();

// 分からない改行を除去
byte[]    crlf;
crlf = new byte[5];
crlf[0] = '&';
crlf[1] = '#';
crlf[2] = '1';
crlf[3] = '3';
crlf[4] = ';';
String    schStr = new String(crlf);
String    repStr = "";
String ResultStr = xml_str.replaceAll(schStr, repStr);

// 文字列書込
FileOutputStream  os = new FileOutputStream(new File(outFileNameXML));
OutputStreamWriter osw = new OutputStreamWriter(os, "Shift_JIS");
osw.write(ResultStr);
osw.close();
------------------------------
この結果、

1行目&#13;
2行目&#13;
3行目

のようなXMLファイルができていたのが

1行目
2行目
3行目

のようにTEXTAREAでの入力どおり 0x0d,0x0a のみの改行でXMLファイル書込でき、ブラウザでの投稿内容表示も希望する形になりました。
何かスマートでなく、無理やりな気がしてなりません。
より妥当な対応内容があれば助言をお願いします。

質問から6ヶ月以上経過しているので、回答を書き込むことはできません。