【问题标题】:Reading XML file with VB.NET使用 VB.NET 读取 XML 文件
【发布时间】:2012-09-09 09:52:47
【问题描述】:

我正在构建这个基于 Web 的应用程序,它将显示未来 24 小时的天气预报,我正在读取一个包含我需要的所有数据的 XML 文件。然而,该文件包含类似标签中的所有数据,如下所示:

<response>
 <hourly_forecast>
  <forecast>
   <temp>
    <metric>DATA!</metric>
   </temp>
  </forecast>
  <forecast>
   <temp>
    <metric>MORE DATA!</metric>
   ...

如你所见,我必须输入一个预测,遍历它的子节点,找到数据,然后以某种方式回到我可以读取下一个预测及其数据的点,等等。我目前正在使用 XMLTextReader 能够读取,并使用 ReadStartElement 和 ReadToNextSibling 方法来浏览文件,但是使用这些方法你无法在文件中备份,你只能下来,所以为了阅读下一个温度我不得不使用 For 循环,使程序“成功”进入下一个预测,但它变得非常耗费资源,对天气 API 进行了太多调用,甚至发出超时错误。如果我将网站上的 XML 文件保存到计算机上的项目目录中,它确实有效,这样它就可以正常运行并快速获取所有数据,但是,一旦我上传,我将无法保存 XML 文件这个网站到服务器。

所以我的问题是,我怎样才能从这个在线天气 XML 文件中提取我需要的数据,然后轻松快速地显示或保存到数据库中?

我在 .NET Framework 3.5 上使用 ASP 和 VB。

【问题讨论】:

  • 不要忘记将它标记为已接受的答案,它对您有用..

标签: asp.net xml vb.net web


【解决方案1】:

使用 XML Literals 在 VB 中重写 @Pushpendra 的示例:

Dim xmlDoc= XDocument.Load(@"c:sites.xml")
Dim query = From c in xmlDoc...<site>
            Select c.<name>.Value & " -- " & c.<url>.Value

For Each name In query
     Console.WriteLine("Site: " + name)
Next

【讨论】:

    【解决方案2】:

    有几种方法可以做到这一点。最简单的方法是使用 XMLTextReader 继续以现有方式加载 XML,但不是一次只加载一个,而是一次将所有这些加载到内存中。例如,如果您创建了这样的类:

    Public Class Forecast
        Public Property Temperature() As Integer
            Get
                Return _temperature
            End Get
            Set(ByVal value As Integer)
                _temperature = value
            End Set
        End Property
        Private _temperature As Integer
    
        ' ... Other properties    
    End Class
    

    然后,在您加载预测的代码中,加载所有预测,而不是仅加载一个,并将它们存储在如下列表中:

    Dim forecasts As New List(Of Forecast)()
    ' Loop through XML, and then for each forecast in XML:
        Dim f As New Forecast()
        f.Temperature = ' Set value based on current forecast data
        forecasts.Add(f)
    ' End loop
    

    然后,稍后,当您需要特定预测时,您可以从内存中已加载的列表中检索它:

    ' Get the first forecast
    Dim f As Forecast = forecasts(0)
    
    ' Get the second forecast
    f = forecasts(1)
    
    ' Etc.
    

    但是,我认为使用您所描述的 XMLTextReader 可能是错误的。使用XDocument、XmlDocument 或XmlSerializer 会更容易。例如,您可以使用 XmlDocument 类轻松地将所有预测加载到列表中,如下所示:

    Dim forecasts As New List(Of Forecast)()
    Dim doc As New XmlDocument()
    doc.Load(xmlFilePath)
    For Each forecastNode As XmlNode In doc.SelectNodes("/response/hourly_forecast/forecast")
        Dim f As New Forecast()
        f.Temperature = Integer.Parse(forecastNode.SelectSingleNode("temp/metric").InnerText)
    Next
    

    【讨论】:

    • 循环“通过 XML”会怎样?
    • 我使用 XmlDocument 在答案底部展示了一个循环示例。我不确定,究竟如何使用 xml 文本阅读器遍历元素。如果您发布了如果您可以展示您当前如何使用该类加载单个预测,我可以给您一个更详细的循环示例。
    【解决方案3】:

    您是否尝试过使用 dataset.ReadXml 方法。如果您熟悉数据集结构,这将使读取数据变得非常容易。它会将您的数据放入数据表中,以便您能够循环访问。

    Dim ds As New DataSet
    ds.ReadXml("File Text as String")
    For Each row as DataRow in ds.Tables("Forecast").Rows
      'Store your data'
    Next
    

    希望这会有所帮助。

    【讨论】:

      【解决方案4】:
      XDocument xmlDoc= XDocument.Load(@"c:sites.xml");
      var q = from c in xmlDoc.Descendants("site")
      select (string)c.Element("name") + " -- " +(string)c.Element("url");
      foreach (string name in q) {
      Console.WriteLine("Site: " + name);
      }
      

      【讨论】:

        【解决方案5】:

        对于此类任务,请使用 LINQ 风格从 XML 中读取、更新、保存和删除数据。

        即利用 LINQ to XML 帮助您实现您想要的目标。

        有这个来源的编号:

        但是去那边的msdn看看:.NET Language-Integrated Query for XML Data

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-07-20
          相关资源
          最近更新 更多