2013-11-04 103 views
0

這是我想分析如何使用xmlreader解析此文檔?

<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> 
以上

文檔只是相隔整個文檔的,全部項目的大約是1/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"> 

和定義三個變量,說他們是

string strRptID; 
string strVendor; 
string strArea; 

然後,循環每個子節點「項目」,看它是否有子節點名稱是「關鍵」

是否存在和「密鑰」的值是‘REPORT_ID’,然後設定strRptID相等的子節點‘值’的值

在第一項的情況下,2467

如果存在和「密鑰」的值是‘vendor_hi’,然後設定strVendor相等的子節點‘值’的值

在這種情況下是01.01。

如果存在和「密鑰」的值是‘area_nm’,然後設定strArea等於子節點的‘價值’的在第一個項目的情況下的值

是馬來西亞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 

赫拉請求是HttpWebRequest的,我在

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

添加斷點時,執行到那裏,它不返回了將近5分鐘,我不知道在那個時候,無論是

下載完成?我認爲下載是發生在

request.GetResponse() 

如果我錯了,請糾正我。

+1

你是什麼意思「太慢」,你爲什麼認爲XmlReader會更快完成?你確定這不是你正在測量的下載延遲?從本地文件加載時是否會遇到延遲? –

+0

你試過了什麼(使用'XmlReader')?另外:你是否使用'XmlSerializer'進行了簡介,將其引入一個簡單的對象模型中,該模型公開'key' /'value'對並從那裏解析?您是否使用'XElement'進行了分析? ('XmlReader'是...很難得到100%的權利;幾乎任何東西都會比直接使用更好) –

+0

爲什麼我說xdocument很慢,請參閱我的編輯 – yangl

回答

0

你所測量是需要下載的文件,而不是的XDocument所需的時間來分析它的時間。使用的XmlReader將採取完全相同的時間(±幾秒鐘如果有的話),因爲的XmlReader將不得不等待,同時下載的文件。

GetResponse確實不是下載整個響應。每當您從響應流中讀取數據時,都會從服務器獲取數據。這只是Web服務器在下載大量數據時的工作方式:它們會返回一個響應,說明一切正常,並允許您打開一個流並從開始讀取響應流中的響應。如果您在結束之前關閉流,服務器會停止發送數據。

+0

當然,這裏需要更正 - 流(tcp套接字)已經打開,當你得到'確定'響應標題,但它被阻止 - 沒有發生讀取。客戶端不會請求一個新的流(如可能必須與FTP一樣)。一個小小的差異,但我們不想混淆這個問題。 – Gusdor

+1

糟糕。不是一個小小的區別。忘記處理該請求會使該流保持打開狀態,直到GC啓動。如果嘗試打開兩個以上的連接到相同的服務器,則會被阻止,並且永遠不知道爲什麼 –

+0

感謝您的回覆,那麼您能否告訴我爲什麼下載花費太多時間,如果我在相同的客戶端機器上發送相同的請求,但使用soapUI,它將比我的代碼更快地返回。 – yangl