4

XML を XmlDocument にロードする場合、つまり

XmlDocument ドキュメント = 新しい XmlDocument();
document.LoadXml(xmlData);

プロセスがエンティティを置き換えるのを止める方法はありますか? TM 文字に変換される xml に TM 記号 (エンティティ #8482 として格納) があるという奇妙な問題があります。私に関する限り、XML ドキュメントには ISO-8859-1 (TM 記号がない) のエンコーディングが含まれているため、これは発生しないはずです。

ありがとう

4

7 に答える 7

4

これは、XML ツールセットに関する一般的な誤解です。「&#x」を使用したビジネス全体は、文字エンコーディングに対処するために設計された構文上の機能です。XmlDocument は文字のストリームではなく、文字エンコーディングの問題から解放されています。代わりに、XML 型データの抽象モデルが含まれています。これには DOM と InfoSet が含まれますが、どちらが正確かはわかりません。

「&#x」ガビンはこのモデルには存在しません。問題全体が無関係であるためです。適切な場合は、情報セットを特定のエンコーディングの文字ストリームに変換すると返されます。

この誤解は、同様の癖のコレクションの一部として学術文献に組み込まれるほど一般的です。この場所で「Xml Fever」を見てください: http://doi.acm.org/10.1145/1364782.1364795

于 2008-09-30T13:26:22.300 に答える
3

何に書いてるの?TextWriter?ストリーム?何?

以下はエンティティを保持します(まあ、それは同等の16進数に置き換えられます)-しかし、StringWriterで同じことを行うと、ユニコードを検出し、代わりにそれを使用します:

    XmlDocument doc = new XmlDocument();
    doc.LoadXml(@"<xml>&#8482;</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>&#x2122;</xml>
于 2008-09-30T13:01:28.243 に答える
2

XMLドキュメントとエンコーディングで少し混乱することを告白しますが、ISO-8859-1をまだ使用している場合は、もう一度保存するときに適切に設定されることを願っていますが、UTFで保存する場合は- 8、それはする必要はありません。ある意味では、論理的には、ドキュメントにはエンティティ参照ではなくシンボルが実際に含まれています。後者は単なるエンコーディングの問題です。(私はここで声を出して考えています-これを信頼できる情報として受け取らないでください。)

ドキュメントを読み込んだ後、ドキュメントをどのように処理しますか?

于 2008-09-30T12:59:42.647 に答える
0

&#xxxx; エンティティは、それらが表す文字と見なされます。すべてのXMLは読み取り時にUnicodeに変換され、そのようなエンティティはすべて削除され、それらが表すUnicode文字が優先されます。これには、LoadXMLに渡される文字列などのUnicodeソースでのそれらの発生が含まれます。

同様に、書き込み中のストリームで表現できない文字を書き込むと、&#xxxx;に変換されます。実在物。それらを保存しようとしてもほとんど意味がありません。

よくある間違いは、Unicode以外のエンコーディングを使用する何らかの手段でDOMから文字列を取得することです。それは何に関係なく起こりません

于 2008-09-30T13:28:52.140 に答える
0

エンティティの内容をCDATAセクションで囲むと、すべてそのままにしておく必要があると思います。

<root>
<testnode>
<![CDATA[some text &#8482;]]>
</testnode>
</root>
于 2008-09-30T13:01:21.520 に答える
0

エンティティ参照はエンコーディング固有ではありません。W3C XML 1.0の推奨事項によると:

文字参照が「&#x」で始まる場合、終了までの数字と文字; ISO /IEC10646で文字のコードポイントの16進表現を提供します。

于 2008-09-30T13:11:36.627 に答える
0

助けてくれてありがとう。

私は、Webページにそれらを吐き出す前に実際にすべての文字を置き換えるHtmlEncode関数を書くことで問題を解決しました(やや壊れたHtmlEncode().NET関数に依存するのではなく、文字が必要です)

于 2008-09-30T16:18:28.037 に答える