0

私はJavaでパーサーを作成しており、XMLdomで文字列を作成しています。

これが私のコードです

String val="\""+val+"\"";
String temp=StringEscapeUtils.escapeXml(val);
node.setTextContent(temp);

それから私はLSSerializerを使用しています

DOMImplementationLS domImplementation = (DOMImplementationLS)doc.getImplementation();
LSSerializer lsSerializer = domImplementation.createLSSerializer();
String tempString=lsSerializer.writeToString(doc);

そしてファイルに保存します。

今私の問題は、文字列の「テスト」が" test"として来るはずだということです。しかし、それは& quot; test"として来ています。

&は別々にエスケープされているようです。誰かが私のコードの何が問題になっているのか教えてもらえますか?

4

1 に答える 1

3

文字列は2回エスケープされます。

  1. "test"-> "test""としてエスケープ"
  2. "test"-> "test"&としてエスケープ&

私はこの行を信じるようにだまされました

node.setTextContent(temp);

すでにエスケープを行っていますが、それは真実ではありません...

Node.setTextContent(String)APIドキュメント

...同様に、設定時に、解析も実行されず、入力文字列は純粋なテキストコンテンツと見なされます

ただし、LSSerializerは次のことを行います。

ドキュメントの文字データ内(マークアップ以外)では、直接表現できない文字はすべて文字参照に置き換えられます。'<'および'&'の出現は、事前定義されたエンティティ<および&に置き換えられます。他の事前定義されたエンティティ(>、'、および ")は、必要な場合を除いて使用されない場合があります(たとえば、']]>'などの場合は>を使用します。

したがって、どちらの場合も、で2回エスケープする必要はありません。StringEscapeUtils.escapeXml(val);その行を省略して、次のようにすることができます。

String val="\""+val+"\"";
node.setTextContent(val);

またはさらに簡単:

node.setTextContent("\""+val+"\"");

または、おそらく私にとっては少し良いでしょう(文字列を連結するのは好きではありません):

node.setText(String.format("\"%s\"", val));

ただし、"(テキストノードで)XML形式を壊さないため、なぜエスケープしたいのかわかりません。

于 2013-03-25T12:14:11.380 に答える