0

これは解析したいドキュメントです

<item xsi:type="ns2:Map">
   <item>
      <key xsi:type="xsd:string">report_id</key>
      <value xsi:type="xsd:string">2467</value>
   </item>
   <item>
      <key xsi:type="xsd:string">vendor_hi</key>
      <value xsi:type="xsd:string">01.01</value>
   </item>
   <item>
      <key xsi:type="xsd:string">area_nm</key>
      <value xsi:type="xsd:string">MALAYSIA MOBILE DIGI</value>
   </item>
</item>
<item xsi:type="ns2:Map">
   <item>
      <key xsi:type="xsd:string">report_id</key>
      <value xsi:type="xsd:string">2467</value>
   </item>
   <item>
      <key xsi:type="xsd:string">vendor_hi</key>
      <value xsi:type="xsd:string">01.07</value>
   </item>
   <item>
      <key xsi:type="xsd:string">area_nm</key>
      <value xsi:type="xsd:string">MALAYSIA MOBILE MAXIS</value>
   </item>
</item>

上記はドキュメント全体のほんの一部です。そのようなコードを使用して解析すると、項目の合計は約 3000 です。

    using (WebResponse response = request.GetResponse())
    {
        using (StreamReader rd = new StreamReader(response.GetResponseStream()))
        {
            XDocument xd = XDocument.Load(rd.BaseStream);

この行まで実行すると

XDocument xd = XDocument.Load(rd.BaseStream);

速度が遅すぎるので、xmlreader を使用して解析したいのですが、私の目的は次のとおりです。最初にすべてのノードをループします

<item xsi:type="ns2:Map">

そして3つの変数を定義し、それらが

string strRptID;
string strVendor;
string strArea;

次に、すべてのサブノード「アイテム」をループし、サブノード名が「キー」であるかどうかを確認します

が存在し、「キー」の値が「report_id」の場合、strRptID をサブノードの「値」の値に等しく設定します

最初の項目の場合は 2467 です

存在し、「key」の値が「vendor_hi」の場合、strVendor をサブノードの「value」の値と等しく設定します

この場合は 01.01 です。

存在し、「キー」の値が「area_nm」の場合、strArea をサブノードの「値」の値と等しく設定します

最初の項目の場合は MALAYSIA MOBILE MAXIS です。

次に、別のループ

そして同じことをします。

xmlreader を使用してこれを行う方法を教えてください。

PS:

    using (WebResponse response = request.GetResponse())
    {
        using (StreamReader rd = new StreamReader(response.GetResponseStream()))
        {
            XDocument xd = XDocument.Load(rd.BaseStream);               //breakpoint this line

hera リクエストは HttpWebRequest で、ブレークポイントを追加します

           XDocument xd = XDocument.Load(rd.BaseStream);  

そこまで実行すると、ほぼ5分間戻りません。その時点ではわかりません。

ダウンロードは完了しましたか?私はダウンロードが起こっていると思います

 request.GetResponse()

私が間違っている場合は、訂正してください。

4

1 に答える 1

0

測定しているのは、ファイルのダウンロードにかかる時間であり、XDocument がファイルを解析するのに必要な時間ではありません。XmlReader を使用すると、XmlReader がファイルをダウンロードするのに同じ時間待機する必要があるため、まったく同じ時間 (ある場合は±数秒) かかります。

GetResponse は応答全体をダウンロードしません。応答ストリームから読み取るたびに、サーバーからデータが取得されます。これはまさに、大量のデータをダウンロードするときに Web サーバーが動作する方法です。サーバーは、すべてが OK であるという応答を返し、ストリームを開き、応答ストリームからの応答の読み取りを開始できるようにします。最後に到達する前にストリームを閉じると、サーバーは単にデータの送信を停止します。

于 2013-11-04T12:04:42.753 に答える