2009-05-12 28 views
12

長時間実行しているアプリケーションから文字列形式のXMLデータを受け取っている小さなプロジェクトに取り組んでいます。この文字列データをXDocumentSystem.Xml.Linq.XDocument)にロードしようとしています。そこからいくつかのXML Magicを実行し、データのレポート用のxlsxファイルを作成します。XML例外:無効な文字

無効なXML文字を含むデータを受け取ることがあり、文字列をXDocumentに解析しようとすると、このエラーが発生します。

[System.Xml.XmlException] メッセージ: '?'、16進値0x1Cは無効な文字です。

私はリモートアプリケーションを制御できないので、どんな種類の文字も期待できます。

XMLには、&#x1Cなどの文字を入力できる方法があることをよく知っています。

可能であれば、私はすべてのデータを保持したいと思います。もしそうでなければ、それを許してください。


私はその後戻って、再解析が例外をスローする必要があるために、私はいくつかの方法を試してみましたし、それらのどれも成功したように見えるんしようとして、プログラム的に応答文字列の編集について考えています。

ありがとうございました。あなたの入力はXMLではない場合、あなたは混乱のアップをきれいに整頓やTagsoupのようなものを使用する必要があり

TextReader tr; 
XDocument doc; 

string   response; //XML string received from server. 
... 
tr = new StringReader (response); 

try 
{ 
    doc = XDocument.Load(tr); 
} 
catch (XmlException e) 
{ 
    //handle here? 
} 

答えて

11

XMLはほぼすべての文字を処理できますが、範囲はcontrol codes and suchです。

あなたが出力を修正できない場合は、受信している生データをサニタイズすることをお勧めします。不正な文字を、あなたが指摘した文字参照フォーマットに置き換える必要があります。

(そこにこれらの文字をエスケープする方法がないとしてあなたも、CDATAに頼ることはできません。)

0

コードは、この線に沿って何かです。

彼らは有用なDOMを作るために、どんな入力をしてもうまくいけばいいです。

どのように関連するダークサイドライブラリが呼び出されるのか分かりません。

9

in this blog postと記載されているものが役に立ちますか?

基本的に、彼はサニタイズxmlストリームを作成します。

+0

実際には、彼は一度にXMLをすべて文字列として処理しています。 –

+0

@Matthew、ええ、彼が.ReadToEnd()を呼び出す例ですが、.Read()などを使用することもできます。私の推測では、OPはあなたの言ったことをする必要があります。 –

+0

そのリンクは非常に便利でした – Meiscooldude

0

ガーベッジ・イン、ゴミ・アウト。リモートアプリケーションがあなたにゴミを送っているなら、それはあなたが得るすべてです。 XMLを送信していると思ったら、修正する必要があります。この場合、あなたはバグを回避することによって何の恩恵も払っていません。

また、自分が送信していると思っていることを確認する必要があります。 %1Cの意味は何ですか?彼らは何をしたいのですか?

+1

私は自分のバグを修正する立場にいたいと思っていますが、私はそうではありません...バグは、フィルタリングされていないユーザ入力から来ます...いくつかのユーザはそこにいくつかの超奇妙なキャラクタを置くことにします... .. – Meiscooldude

+0

私はゴミを拒否し、何が拒否されたかを示すレポートを作成することをお勧めします。その後、少なくとも月に1回、バグのあるコードの所有者にそのレポートを送信します。 –

0

IMHOあなたのプログラムに供給されている無効なXMLを生成したコード/プログラム/を変更するのが最善の解決策です。残念ながら、これは常に可能ではありません。この場合、文書をロードする前にすべての文字< 0x20をエスケープする必要があります。

0

ソースXMLデータを実際に修正できない場合は、this answerで説明したようなアプローチをとることを検討してください。基本的には、既存のTextReader(tr)をラップして無効な文字を破棄するTextReaderサブクラス(StripTextReaderなど)を作成します。

+0

答えは文字が本当にゴミであることを意味します。彼がしなければならないことはすべてそれらを捨てることです。私は彼が最初にそれらの文字が何を意味するのかを知るべきだと提案した。 –

14

あなたはたXmlReaderを使用してXmlReaderSettings.CheckCharactersプロパティを設定することができます。これにより、無効な文字にもかかわらずXMLファイルを読み取ることができます。そこからXmlDocumentまたはXDocumentオブジェクトに渡すことができます。

私のblogについてもう少し詳しく読むことができます。

XDocument xDocument = null; 
XmlReaderSettings xmlReaderSettings = new XmlReaderSettings { CheckCharacters = false }; 
using (XmlReader xmlReader = XmlReader.Create(filename, xmlReaderSettings)) 
{ 
    xmlReader.MoveToContent(); 
    xDocument = XDocument.Load(xmlReader); 
} 

詳しい情報はhereを見つけることができます:それはこのような少し何かを見ていきますSystem.Xml.Linq.XDocumentにデータをロードするために

+2

** MSDNの関連リンク:** [XmlReaderSettings.CheckCharactersプロパティ](http://msdn.microsoft.com/en-us/library/system.xml.xmlreadersettings.checkcharacters%28v=vs.110%29.aspx )と[XmlReader.MoveToContentメソッド](http://msdn.microsoft.com/en-us/library/system.xml.xmlreader.movetocontent%28v=vs.110%29.aspx)を参照してください。 – DavidRR

関連する問題