2009-08-31 21 views
2

次のXMLファイルを逆シリアル化しています。 VSTS 2008 + C#+ .Net 3.5でXMLシリアライザを使用するXMLの逆シリアル化に失敗する

ここにXMLファイルがあります。ここで

<?xml version="1.0" encoding="utf-8"?> 
<Person><Name>=b?olu</Name></Person> 

ような文字を受け入れるためにいくつかの解決策がある場合は、XMLファイルのXMLファイルとバイナリ形式の表示のための画面のスナップショット、

alt text http://i25.tinypic.com/e7i844.jpg

alt text http://i25.tinypic.com/23wjnev.jpg

です、それは素晴らしいでしょう!私のXMLファイルは大きいので、そのような文字が本当に無効でフィルタリングが必要な場合は、逆シリアル化後にXMLファイルの内容を残しておきたい。

現在、XMLの逆シリアル化はInvalidOperationExceptionで失敗し、XMLファイル情報全体が失われます。

実際には、このXMLファイルをVSTSで開くと、エラー1文字 '?'のようなエラーが発生します.16進値0xffffはXMLドキュメントでは不正です。バイナリ形式では0xffff値がないので混乱しています。

すべてのソリューションやアイデアは?

EDIT1:ここでは

static void Foo() 
    { 
     XmlSerializer s = new XmlSerializer(typeof(Person)); 
     StreamReader file = new StreamReader("bug.xml"); 
     s.Deserialize(file); 
    } 

public class Person 
{ 
    public string Name; 
} 
+2

xmlを逆シリアル化するために使用しているコードを投稿することもできますか? –

+0

投稿、任意のアイデアですか? :-) – George2

+0

George、常に完全な例外を投稿してください:ex.ToString()の出力。 –

答えて

1

は、このスタイルのヘルプをい、XMLファイルをデシリアライズするために使用されている私のコードですか?

<name> 
    <![CDATA[ 
    =b?olu 
    ]]> 
</name> 

いずれか、またはencodingがこのトリックを行う必要があります。

編集:このページは:http://www.eggheadcafe.com/articles/system.xml.xmlserialization.aspです。具体的には、逆シリアル化のために、このコード:「StringToUTF8ByteArray」と「Encoding.UTF8」について

public Object DeserializeObject(String pXmlizedString) 
{ 
    XmlSerializer xs = new XmlSerializer(typeof(Automobile)); 
    MemoryStream memoryStream = new MemoryStream(StringToUTF8ByteArray(pXmlizedString)); 
    XmlTextWriter xmlTextWriter = new XmlTextWriter(memoryStream, Encoding.UTF8); 
    return xs.Deserialize(memoryStream); 
    } 

その部分はあなたから妙に欠けて見えます。私は.NETがあなたの実際のXMLファイルのエンコーディングを読むのが好きではないと推測しています...?

+0

ありがとうグレン、問題は、XMLファイルは私のアプリケーションの入力です、私は決してそれを変更することはできません。無効な文字をフィルタリングし、残りの文字を解析(デシリアライズ)し続ける方法を見つける必要があります。そのような文字を受け入れる方法があれば、それはより大きくなります! – George2

+1

SAXパーサー(http://stackoverflow.com/questions/127869/sax-vs-xmltextreader-sax-in-c)が必要な場合や、XMLを前処理してストリップ/エンコードする必要がある場合は、問題の文字を正規表現などで置き換えます。正規表現の例を掘り起こす必要があるかもしれません。私はここでそれを与えるためにそれに十分に精通していない。 – Glenn

+1

ああ、SAXパーサーを使用していても、文字をサニタイズする必要があります。だからあなたはそれを過負荷にしなければならないかもしれません。 – Glenn

1

代わりにDataContractSerializerを試しましたか?私は面白い状況に遭遇しました。誰かが何らかの単語をコピーして貼り付けたり、ウェブアプリケーションに盛り込んだりすると、文字列に無効な制御文字(垂直タブなど)が含まれていました。私の驚いたことに、これはWCFサービスに送信するときにシリアル化され、要求時に元の100%のオリジナルを読み戻すことさえありました。純粋な.net環境はこれに問題がなかったので、私はDataContractSerializerがそのようなものを扱うことができると仮定します(ただし、IMHOはXML仕様に違反しています)。

同じサービスにアクセスしている別のJavaクライアントがありました。このレコードを受信すると失敗しました...

[以下の私のコメントに醜いフォーマット後の編集]これを試してみてください:

DataContractSerializer serializer = new DataContractSerializer(typeof(MyType)); 
using (XmlWriter xmlWriter = new XmlTextWriter(filePath, Encoding.UTF8)) 
{ 
    serializer.WriteObject(xmlWriter, instanceOfMyType); 
} 
using (XmlReader xmlReader = new XmlTextReader(filePath)) 
{ 
    MyType = serializer.ReadObject(xmlReader) as MyType; 
} 

DataContractSerializers癖がXmlElements代わりのXMLATTRIBUTES作るために約二マルクのコメントは以下のとおりです。

<AnElement>value</AnElement> 

の代わりに

<AnElement AnAttribute="value" /> 
+0

しかし、WCFを使用していないため、DataContractSerializerを使用できますか? – George2

+1

もちろん、ドキュメントを読むことができます。これはとても簡単だ! – Dabblernl

+1

データに属性が含まれていない限り... –

0

"無効な文字"は、エンコードされたUnicode文字のように見えます。おそらくそれらは間違ったエンコーディングが使用されているでしょうか

この文書の作成者に、どのような文字をという意味のに含めることができますか?おそらく彼らが文書をどのように生成したのか尋ねるでしょうか?

関連する問題