5

XML形式のファイルがあります(ルートの開始タグと終了タグ、およびルートの子のみで構成されています)。子のテキスト要素には、アンパサンド記号 & が含まれています。XML では、ドキュメントを有効にするためにこの記号を使用することは許可されていません。Java の DOM API と XML パーサーを使用してファイルを処理しようとすると、解析エラーが発生しました。そのため、 & を に置き換え&、ファイルを正常に処理しました。さまざまなプレーン テキスト ファイルのテキスト要素の値を抽出する必要がありました。

これらの新しく作成されたテキスト ファイルを開くと&、 が表示されるはずでしたが、代わりに & が表示されていました。どうしてこれなの?テキストを拡張子なしのテキスト ファイルに保存しました (XML 形式の元のファイルにも .xml 拡張子がありませんでした)。ファイルをどのように開いても、新しいファイルのテキストには & だけがあります。 txt または xml ファイルとして (これらは、XML エディターのオプションの一部です)。正確にはどうなりますか?Java (?)&は & に自動的に変換されますか? または、デフォルトのエンコーディングがありますか?&の&略で、「目に見えない」自動変換があると思いますが、これがいつ、どのように発生するのか混乱しています。元のファイルと、元のファイルを Java で処理した後に受け取った抽出ファイルの例を次に示します。

これは、XML 形式の「negative.review」ファイルです。

<review>
<review_text>
I will not wear it as it is too big &amp; looks funny on me. 
</review_text>
</review>

これは、抽出したファイル「negative_1」です。

I will not wear it as it is too big & looks funny on me. 

私にとっては、元のデータをそのまま (変換/置換を行わずに) 保持することが重要なので、抽出したファイル "negative_1" を処理し&amp;て & に戻す必要があると考えました。ご覧のとおり、これを行う必要はないようです。しかし、理由がわかりません:(。

前もって感謝します!

4

2 に答える 2

11

理由は簡単です。XML ファイルに実際に"&"文字が含まれているからです。

"&"これまで見てきたように、実数自体が XML ファイルを破壊するため、表現が異なるだけです (つまり、「エスケープ」されます)。XML 1.0 仕様の関連セクション「2.4 Character Data and Markup」を読んでください。ほんの数行ですが、問題を非常によく説明しています。

XML はデータ (!) の表現です。テキストファイルとは考えないでください。例:

文字列「17 < 20」を XML ファイルに保存します。「<」は開始タグブラケットとして予約されているため、最初はできません。したがって、これは無効になります。

<xml>17 < 20</xml>

解決策: ファイルの有効性を維持するためだけに、特殊文字/予約文字に文字エスケープを使用します。

<xml>17 &lt; 20</xml>

すべての実用的な目的のために、上記のスニペットには次のデータが含まれています (今回は JSON 表現)。

{
  "xml": "17 < 20"
}

"&"これが、後処理で本物を見る理由です。同じように逃げてきたが、意味はずっと変わらない。

上記の例は、"&"を特別に扱わなければならない理由も説明しています。これは、それ自体が XML エスケープ メカニズムの一部です。のように、エスケープ シーケンスの開始を示し"&lt;"ます。したがって、それ自体をエスケープする必要があります("&amp;"あなたが行ったように)。

于 2009-05-16T08:24:43.990 に答える
2

XML パーサーは、ファイルの解析プロセスの一環として&amp;&lt;、 、 などのエンティティを対応する文字に暗黙的に変換します。&gt;

于 2009-05-16T08:23:26.863 に答える