2013-11-04 54 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