1

私はこのような文字列を持っています

"<root><text>My test is > & < </text></root>"

実際には、これは正しい xml ですが、&、<、> 記号は除きます。

<root><text>My test is &gt; &amp; &lt; </text></root>XElement.Parse(str); で変換する前に、変換する必要があります。

この変換を行う方法は?

4

4 に答える 4

7

new XElement次の代わりに使用すると、XElement はテキストを自動的にエスケープしますXElement.Parse()

LINQPad スニペット:

var str = "<root><text>My test is > & < </text></root>";
var element = new XElement("element", str);
element.Dump();

出力:

<element>&lt;root&gt;&lt;text&gt;My test is &gt; &amp; &lt; &lt;/text&gt;&lt;/root&gt;</element>

編集:私は質問を読み直しましたが、これが目的の出力を生成しないことに気付きました。

問題は、着信 XML 文字列が根本的に無効であることです。ソースを制御できる場合は、そこで修正する必要があります。そうでない場合、それを修正する簡単な方法はありません。

于 2012-05-10T10:44:20.920 に答える
2

これを確実に達成することはほぼ不可能です。この問題はソースで修正する必要があります。"My test is > & < " 文字列を挿入するシステムを制御する場合は、挿入する前にこの文字列をエスケープする必要があります。HttpUtility.HtmlEncodeそれを行うための合理的な方法です。

于 2012-05-10T10:38:04.303 に答える
1

変数をユーザー テキストに置き換えないでください (これは XML インジェクションです - バグが多く、安全ではありません)。それらをエスケープされたテキストに置き換えます。XML エスケープ関数は次のとおりです: http://msdn.microsoft.com/en-us/library/system.security.securityelement.escape%28VS.80%29.aspx

これは、HTML で行う場合と同じです。

于 2012-05-10T10:39:26.630 に答える
1

これが「xyz を除く XML」であるという考えは、おそらくもっと綿密に検討する必要があります。これに適切に取り組むには、「xyz を除く XML」と呼ぶ言語の文法を定義する必要があります。次に、その文法に準拠したドキュメントを分析するパーサーを作成する必要があります。このパーサーの出力は、入力の XML 表現にすることができます。これはすべて非常に実行可能です。簡単ではありませんが、実行可能です。もちろん、XML のような標準を使用する利点は、すぐに使えるパーサーを入手できることです。一方、独自の文法を考案した場合は、独自のパーサーを作成する必要があります。

自分の言語に適したパーサーを作成するには、特に広範なテストが必要なため、時間がかかります。テストが不十分な悪いパーサーを作成するのは、おそらく非常に簡単です。これは、多くの悪いプログラマーが行うことです。このような状況にある優れたソフトウェア エンジニアは、標準に準拠することの利点を認識しています。

于 2012-05-10T11:27:20.343 に答える