2012-02-27 7 views
7

可能性の重複:文字がCDATAの内部にあるときにXMLシリアライザが無効な文字例外をスローするのはなぜですか?

var c = '\x1A'; 

    var xml = new XDocument(
       new XDeclaration("1.0", "utf-8", null), 
       new XElement("test", new XCData(c.ToString())) 
      ); 

    var foo = xml.ToString(); // ArgumentException 

はなぜ.NETは、この例外がスローされます。これは、ArgumentExceptionがスローを
Why are “control” characters illegal in XML?
Saving an escape character 0x1b in an XML file

?私はCDATAに違法文字をラッピングしているので、違法な文字が私のために処理されると思っていたでしょう。これは他の文字(例:0x1B、0x1C、0x1E、0x1E、0x1F)の場合も同様です。

この問題を回避するにはどうすればよいですか?

+4

これらの質問を参照してください:[エスケープ文字0x1bをXMLファイルに保存する](http://stackoverflow.com/questions/4134438/saving-an-escape-character-0x1b-in-an-xml-file) [XMLで "制御"文字が不正なのはなぜですか?](http://stackoverflow.com/questions/404107/why-are-control-characters-illegal-in-xml) Workaraundは、XMLに保存する前にBase64エンコーディングを使用することになります。 – oleksii

+0

@oleksii正しい応答であるため、これを答えにする必要があります。 – Bevan

+0

@Bevan:いいえ、実際には、質問は重複として閉じてください。 –

答えて

0

\ x1Aが制御コードであるため、SecurityElement.Escapeが機能しないと思われます。代わりに有効なxmlエンティティはありません。

もう少し詳しくはlist of valid XML charactersを参照してください。

-1

System.Security名前空間のSecurityElementを使用して、xmlデータをエスケープされたデータとして保存してください。詳しい情報はhere

string xmlData = SecurityElement.Escape(xmlData); 

無効なXML文字を見つけることができますfalseに設定CheckCharactersプロパティで設定XmlWriterSettingsとXDocumentを作成することによって書き込むことができます。これは、それらを&#0のような数字で置き換えます。 - &#0x1F。詳細については、thisの記事を参照してください。また、代替として、いくつかのクリーンアップXMLメソッドを呼び出すことができますthis one.

+0

それは動作しません。 SecurityElement.Escapeを使用した後でも、文字\ x1Aの引き続きArgumentExceptionが発生します。 –

+0

あなたの文脈でどのように使用したかを教えてください。 –

+1

何があっても、制御文字はXMLでは許可されません。 –

関連する問題