.NET XmlDocument LoadXMLおよびエンティティ
質問
XMLをXmlDocumentに読み込むとき、つまり
XmlDocument document = new XmlDocument(); document.LoadXml(xmlData);
プロセスがエンティティを置き換えるのを止める方法はありますか? xmlにTM文字に変換されるTMシンボル(エンティティ#8482として格納されている)があるという奇妙な問題があります。私が懸念している限り、XMLドキュメントのエンコーディングはISO-8859-1(TM記号はありません)であるため、これは起こりません。
ありがとう
解決
これは、XMLツールセットの標準的な誤解です。 「& #x」を使用するビジネス全体は、文字エンコーディングに対処するために設計された構文上の機能です。 XmlDocumentは文字のストリームではありません-文字エンコードの問題はありません-代わりに、XML型データの抽象モデルが含まれています。これにはDOMとInfoSetが含まれますが、どちらが正確であるかは正確にはわかりません。
"&#x"問題全体が無関係であるため、ガビンはこのモデルには存在しません。適切な場合、Info Setを特定のエンコーディングで文字ストリームに戻すときに返されます。
この誤解は、類似の癖のコレクションの一部として学術文献に入れられるほど十分に一般的です。 「Xml Fever」をご覧ください。この場所: http://doi.acm.org/10.1145/1364782.1364795
他のヒント
何に書いているの? TextWriter?ストリーム?何?
次はエンティティを保持します(まあ、それを16進数に置き換えます)-ただし、StringWriterで同じことを行うと、ユニコードを検出し、代わりに使用します:
XmlDocument doc = new XmlDocument();
doc.LoadXml(@"<xml>™</xml>");
using (MemoryStream ms = new MemoryStream())
{
XmlWriterSettings settings = new XmlWriterSettings();
settings.Encoding = Encoding.GetEncoding("ISO-8859-1");
XmlWriter xw = XmlWriter.Create(ms, settings);
doc.Save(xw);
xw.Close();
Console.WriteLine(Encoding.UTF8.GetString(ms.ToArray()));
}
出力:
<?xml version="1.0" encoding="iso-8859-1"?><xml>™</xml>
XML文書とエンコーディングは少し混乱することを認めますが、まだISO-8859-1を使用している場合は、再度保存するときに適切に設定されることを望みます-ただし、 UTF-8では、その必要はありません。いくつかの点で、論理的にはドキュメントにはエンティティ参照ではなくシンボルが実際に含まれています-後者は単なるエンコードの問題です。 (私はここで声に出して考えています-これを信頼できる情報として受け取らないでください。)
ドキュメントを読み込んだ後、ドキュメントで何をしていますか?
CDATAセクションでエンティティのコンテンツを囲む場合、すべてそのままにしておく必要があります。例:
<root>
<testnode>
<![CDATA[some text ™]]>
</testnode>
</root>
エンティティ参照はエンコード固有ではありません。 W3C XML 1.0勧告:
文字参照が次で始まる場合 &quot;&amp;#x&quot ;、最大で数字と文字 終端;を提供する の16進表現 ISO / IECでの文字のコードポイント 10646。
&amp; #xxxx;エンティティは、それらが表す文字と見なされます。すべてのXMLは読み取り時にUnicodeに変換され、そのようなエンティティは、それらが表すUnicode文字を優先して削除されます。これには、LoadXMLに渡される文字列など、Unicodeソースでのそれらの発生が含まれます。
同様に、書き込み先のストリームでは表現できない文字は、&amp; #xxxx;に変換されます。エンティティ。それらを保存しようとする意味はほとんどありません。
よくある間違いは、Unicode以外のエンコーディングを使用する何らかの方法でDOMからStringを取得することです。それはただ
すべてのヘルプに感謝します。
Webページに文字を吐き出す前に実際にすべての文字を置き換えるHtmlEncode関数を書くことで問題を修正しました必要な文字のサブセット)