巨大でエラーのあるxmlファイルのデシリアライズ

しばらく前、あるプロジェクトで、xmlファイルによってアップロードされたデータをインポートするタスクがありました。 荷降ろしがどこから来たかは私には知られておらず、問題ではありません。 主なことは、すべてが特定のフォルダーに移動したことです。 各xmlファイルには、1種類の情報が含まれていました(同じ種類の1つ以上のオブジェクトに関する情報がアップロードされました)。 プロジェクトはC#で記述されているため、解析はその手段で実行されました。

正直なところ、私はxmlファイルを扱ったことがなかったので、そのような可能性はありませんでした。そして、ここではそのような幸福です... 最初は、XmlDocumentクラスを使用してデータをサンプリングし、XmlTextReaderクラスを使用してファイルの内容をすばやく決定しました。 オブジェクトの多様性が大幅に増加し、すべての人の解析が消極的になるまで、すべてがうまくいきました。 ここで、シリアル化は単なる言葉ではなく、綿密な研究の対象となっています。 幸いなことに、すべてのxmlファイルについて、xsd形式で保存されたデータの構造の説明が添付されています。 Visual Studioのxsdユーティリティを使用して、このビジネスをC#のソースにすばやく変換しました。これは数百キロバイトかかりました。 それでは、多くのサイトのすべての例のように:

using( FileStream stream = new FileStream(NameFile) )
{
    XmlSerializer xs = new XmlSerializer(typeof(ImportObject));
    ImportObject obj = (ImportObject)xs.Deserialize(stream);
}


* This source code was highlighted with Source Code Highlighter.


, obj .

xml (null) . xml ( <Value/>). null , - . xsd, , , , . , , . . . , xml … ! .
xml , . . <Value/> 0. FileStream. Deserialize(). – Read():

class MyStream : FileStream
{
  public MyStream(string NameFile)
  {
  }

  public override int Read(byte[] array, int offset, int count)
  {
    …
  }
}


* This source code was highlighted with Source Code Highlighter.


, – . Read , : , DateTime.MinValue, array. Deserialize(). null , xml , , . , MyStream Read() , . . Deserialize(), , . , . .

, - . .
xml , ( , ). ProgressBar, , . .


StreamReader, . . Read() 1024 , , , . StreamReader , , . , , , . , Read() 0. Deserialize(), .

P.s. (poleznij sovet) , ( ) , ( ).


Source: https://habr.com/ru/post/J111646/


All Articles