xml - 表示 - 開始 タグ 終了 タグ 対応 し てい ませ ん
XMLの無効な文字 (10)
C#で潜在的に望ましくないXML / XHTML文字をエスケープするもう1つの簡単な方法は次のとおりです。
WebUtility.HtmlEncode(stringWithStrangeChars)
私は現時点でいくつかのXMLを扱っています。
私は以下のような文字列を保持するノードを持っています:
<node>This is a string</node>
ノードに渡す文字列の中には、&、#、$などの文字があります。
<node>This is a string & so is this</node>
これは、
私はこれらの文字列をそのままCDATAにラップすることはできません。 私はCDATAの中にいなくてもXMLノードに入れられない文字のリストをオンラインで探してみました。
誰かが私を1つの方向に向けるか、違法な文字のリストを私に提供することができますか?
Javaの人々のために、ApacheにはヘルパーメソッドescapeXmlを持つユーティリティクラス(StringEscapeUtils)があり、XMLエンティティを使用して文字列のエスケープに使用できます。
XSL(本当に怠惰な日に)私は使用します:
capture="&(?!amp;)" capturereplace="&amp;"
påampの後にないすべての&記号を翻訳する。 適切なものに。
入力がCDATAにある場合がありますが、XMLを使用するシステムでは考慮されません。 それはちょっとした修正です、注意してください...
XmlConvert.IsXmlCharメソッドを使用してC#で間違ったXML文字を削除する別の方法 (.NET Framework 4.0以降で使用可能)
public static string RemoveInvalidXmlChars(string content)
{
return new string(content.Where(ch => System.Xml.XmlConvert.IsXmlChar(ch)).ToArray());
}
すべての文字がXML有効であることを確認することができます。
public static bool CheckValidXmlChars(string content)
{
return content.All(ch => System.Xml.XmlConvert.IsXmlChar(ch));
}
.Net Fiddle - https://dotnetfiddle.net/v1TNus
たとえば、垂直タブ記号(\ v)はXMLには有効ではありませんが、有効なUTF-8ですが有効なXML 1.0ではなく、多くのライブラリ(libxml2を含む)でもそれを見落とし、無効なXMLを出力します。
この答えは私のために働いた
string code = Regex.Replace(item.Code, @"[\u0000-\u0008,\u000B,\u000C,\u000E-\u001F]", "");
これは、文字列からXML無効な文字を削除し、新しい有効な文字列を返すC#コードです。
public static string CleanInvalidXmlChars(string text)
{
// From xml spec valid chars:
// #x9 | #xA | #xD | [#x20-#xD7FF] | [#xE000-#xFFFD] | [#x10000-#x10FFFF]
// any Unicode character, excluding the surrogate blocks, FFFE, and FFFF.
string re = @"[^\x09\x0A\x0D\x20-\uD7FF\uE000-\uFFFD\u10000-\u10FFFF]";
return Regex.Replace(text, re, "");
}
不正な文字は&
、 <
および>
(および属性の"
または'
)です。
それらはXMLエンティティを使用してエスケープされ&
この場合、 &
&
ために。
しかし、実際には、XMLを書くツールやライブラリを使用して、このようなことをあなたのために抽象化して、心配する必要はありません。
要約すると、テキスト内の有効な文字は次のとおりです。
- タブ、ラインフィード、キャリッジリターン、
- &と<; を除くすべての非制御文字が有効です。
- >は、]の後に続くと有効ではありません]。
XML仕様の第2.2節と第2.4節では、答えを詳細に示しています。
キャラクター
法的文字は、タブ、改行、改行、およびUnicodeとISO / IEC 10646の有効な文字です
文字データ
アンパサンド文字(&)と左角カッコ(<)は、マークアップ区切り記号として使用する場合、またはコメント、処理命令、またはCDATAセクション内で使用する場合を除き、リテラル形式では使用できません。 それらが他の場所で必要とされる場合は、数値文字参照または文字列 "&"と "<"をそれぞれ使用してエスケープする必要があります。 直角括弧(>)は文字列 ">"を使用して表現することができ、文字列 "]]>"にコンテンツが現れるときは互換性のために ">"または文字参照を使用してエスケープする必要があります。 stringはCDATAセクションの終わりをマークしていません。
誰でもこのSystem.Security.SecurityElement.Escape(yourstring)
試しましたか? これは、文字列中の無効なXML文字を、有効な同等のものに置き換えます