C#で徐々にXMLをロードする方法は?
-
26-09-2019 - |
質問
私は徐々に非同期コールバックをXMLにResponseStream
からロード処理する必要があります。
返信はしています。
<root>
<node ...>
.....
</node>
<node />
...
</root>
スキーマ、と私は、彼らが完全に到着する前に能力プロセス<node>
のを持っている必要があります。
標準.NETを使用してそれを解析するための通常の方法はありますか?
解決
System.Xml.XmlTextReader
「高速なXMLデータへの非キャッシュ、前方専用のアクセスを提供するリーダーを表します。」
http://msdn.microsoft.com/en -us /ライブラリ/ system.xml.xmltextreader.aspxする
編集: これは、クイックハックですが、それは読者が実際に怠惰であることを実証しているんます。
public class XmlTextReaderTest
{
public void RunTest()
{
var fs = new XmlTextReader(new Fs(@"c:\TestXml.xml"));
while (fs.Read())
File.AppendAllText(@"c:\xLog.txt", "Processing node..." + Environment.NewLine);
}
}
public class Fs : FileStream
{
public Fs(string path)
: base(path, FileMode.Open)
{
}
public override int Read(byte[] array, int offset, int count)
{
File.AppendAllText(@"c:\xLog.txt", "Reading from stream..." + Environment.NewLine);
var ans = base.Read(array, offset, count);
return ans;
}
}
他のヒント
DOは非同期コールバックにそれを呼び出すない、あなたがする必要はありません(信託私、これは...明確になるだろう)。
情報が利用可能であるように、 ResponseStreamがロードされます。送信されません(「小」の非常に大きな値のために、私は怖い)小さなストリームの場合、ストリーム全体がダウンロードされたとき、これはなりチャンク。ストリームが(これはバッファリングがオフになっているかResponse.Flush()
が呼び出された場合にASP.NETで何が起こるか、他のウェブサーバ技術は、それらの同等物を持っている)チャンク転送エンコードで送信された場合は、ストリームは、最初のチャンクで利用できるようになりますます。
ResponseStreamからあなたのXMLReaderを作成します。これは、最初のチャンクが利用可能であることから処理を開始し、彼らはあなたのコードにかなり透過的に到着すると、後続のチャンクを取得します。
を確認してくださいとして利用可能な基準でこれらのノードを使用して取引が実際にラインに沿って、さらにコードに利益をもたらすこと。例えば。コンソールまたはフォームに出力する場合、各ノードが処理(またはノードの小バッチ)されるように、これらのノードからオブジェクトを作成する場合、一方は、コレクションを構築するのではなく、それらをyield return
、これを行う。
さて、ここでの大きなものではなく、あなたの処理コードに比べ、明らかにウェブストリームがチャンクされているかどうかの問題です。プロデューサーは、これを行うように説得することはできません別の当事者である場合は、あなたの処理中に低いレベルに低下する必要があります。しかし、これはその後、やってそうであるならばそう、彼らは最初のバイトを送信する前に、彼らの最後に行われます、全体の処理と偽の最適化は非常に可能性があり、それが最大の遅延はなりましたさ。本当に、全体の応答がダウンロードされ得るために遅延が、あなたのコードのために、あなたの必要の問題であれば、それらはあなたの部分のも、最も効率的なアプローチで遅延がまだあまりにも素晴らしいものだとして、チャンクの送信を開始しますます。
は記録のために、私はかなり最近確認されたことを、私はクライアントとサーバーの両方のコードを制御し、デバッガの両方で実行していると、上のチェックすることができチャンクデータとにWebResponseの取引上のXmlReaderのような使用(中各チャンクが利用可能であるような動作のため)、処理を実際に実行されます。
はい、あなたが使用できることを読者があります。基本的には流れに沿って行くと、すべての要素、それを識別(要素、属性など)のためのイベントを投げるます。