【问题标题】:How to use xmlreader to parse this document?如何使用 xmlreader 解析这个文档?
【发布时间】:2013-11-04 09:10:04
【问题描述】:

这是我要解析的文档

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

以上只是整个文档的一部分,项目总数约为3000s,如果我使用这样的代码来解析

    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;

然后,循环每个子节点“item”,看是否有一个子节点名为“key”

如果存在且“key”的值为“report_id”,则设置strRptID等于子节点“value”的值

在第一项的情况下是 2467

如果存在且“key”的值为“vendor_hi”,则设置strVendor等于子节点“value”的值

在这种情况下是 01.01。

如果存在且“key”的值为“area_nm”,则设置strArea等于子节点“value”的值

第一项的情况是 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()

如果我错了,请纠正我。

【问题讨论】:

  • “太慢”是什么意思,为什么您认为 XmlReader 会更快完成?您确定这不是您测量的下载延迟吗?从本地文件加载时是否遇到延迟?
  • 你试过什么(使用XmlReader)?另外:您是否使用XmlSerializer 对其进行了分析以将其放入一个简单的对象模型中,该对象模型公开key/value 对并从那里解析?您是否使用 XElement 进行了分析? (XmlReader 是……很难做到 100% 正确;几乎任何东西都比直接使用更好)
  • 为什么我说 xdocument 很慢,请看我的编辑
  • 您正在测量下载时间。
  • 要回答您的问题,请参阅stackoverflow.com/questions/4184194/…

标签: c# xml xmlreader


【解决方案1】:

您测量的是下载文件所需的时间,而不是 XDocument 解析文件所需的时间。使用 XmlReader 将花费完全相同的时间(±几秒钟,如果有的话),因为 XmlReader 必须等待相同的时间才能下载文件。

GetResponse 不会下载整个响应。每当您从响应流中读取数据时,都会从服务器中提取数据。这正是您下载大量数据时 Web 服务器的工作方式:它们返回一个表示一切正常的响应,并允许您打开一个流并开始从响应流中读取响应。如果您在到达终点之前关闭流,服务器只会停止发送数据。

【讨论】:

  • 这里肯定需要更正 - 当您获得 OK 响应标头时,流(tcp 套接字)已经打开,但它已停止 - 没有发生读取。客户端不请求新的流(可能必须使用 FTP)。细微的差别,但我们不想混淆这个问题。
  • 糟糕。不是小区别。忘记处理请求会在 GC 启动之前让流保持打开状态。如果您尝试打开两个以上到同一服务器的连接,您将被阻止并且永远不知道为什么
  • 谢谢你的回复,那你能告诉我为什么下载花费太多时间吗,如果我在同一台客户端机器上发送相同的请求但使用soapUI,它会比我的代码返回快得多。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-19
  • 2012-09-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多