1

次のような属性を含む XML ドキュメントを処理する必要があります。

<action name="foo -> bar">

簡単にすると:

XmlDocument doc = new XmlDocument();
doc.Load(stInPath);
doc.Save(stOutPath);

属性文字列はエスケープされます:

<action name="foo -&gt; bar">

これはまさに私が防ぎたいことです。

これを行う方法を知っていますか (後でxmlファイル全体を検索&置換する以外)?

編集:それは正当な行動のようで、これについて心配する必要はありません(Jon Skeetの回答を参照)

4

2 に答える 2

5

そのエスケープを適用しない必要があるのはなぜですか?

通常のパーサーは、解析時に適切な「エスケープ解除」を適用する必要があります。結果の XML ドキュメントをプレーンテキスト ドキュメントとしてテストしようとしているように思えますが、これはめったに良い考えではありません。XML 文書は、ほとんどの場合、次のステップで XML パーサーに渡されますが、この時点では問題ありません。

私は、.NET XML ライブラリがこれを行うのを防ぐ方法を知りません。そのような機能があったとしたら、少し驚くでしょう。

于 2009-11-12T11:10:45.287 に答える
4

これはまさに私が防ぎたいことです。

本当に?そのエスケープが適用されるかどうかは、一般的にまったく重要ではありません。どちらの XML 情報セットも同じです。

率直に言って、ドキュメントがまったくロードされないことに少し驚いています。

>属性値に含めるのに完全に有効な文字です。XML でエスケープする必要がある唯一の場所>は、仕様のあいまいでばかげた規則により、テキスト コンテンツ内のシーケンス内です。&]]>

この問題について考える必要がないように、多くの XML シリアライザーは習慣的>にテキスト コンテンツまたは属性値のどこでもエスケープします。

Canonical XML仕様では、出力を単純な文字列として比較できるように、XML ドキュメントをシリアル化する特定の方法が 1 つ指定されています。たとえば、属性をどのように順序付けるべきかを正確に示しています。Canonical XML は>、テキスト コンテンツでのエスケープを支持しますが、属性値でのエスケープを否定しています。そのため、Canonical XML シリアライザーを使用してドキュメントを出力すると、その特定の値に対して期待した結果が得られます。(ただし、他の例でどのように見えるかは保証できません。)

次のようなXmlDsigC14NTransform (または XmlDsigC14NWithCommentsTransform)を使用して、.NET で canonicaliser を取得できます。

XmlDsigC14NTransform transform= new XmlDsigC14NTransform(false);
transform.LoadInput(doc);
Stream stream= (Stream) t.GetOutput(typeof(Stream));
// write stream to file
于 2009-11-12T11:37:49.740 に答える