【问题标题】:VBA openweathermap XML retrievalVBA openweathermap XML 检索
【发布时间】:2014-08-16 02:54:22
【问题描述】:

我有一个电子表格,其中包含 A 列中的城市,州。我想从当天到 B 列中获取 3 天的沉淀类型/值。我开始使用 openweathermap API,但我发现我缺乏经验XML 正在杀死我。以下是我的开始方式,但我无法走得更远。我为使用节点和元素所做的任何尝试都没有成功。任何帮助将不胜感激。

这里是一个示例 XML 的链接 http://api.openweathermap.org/data/2.5/forecast/daily?q=Boston+MA&mode=xml&units=metric&cnt=7?

Option Explicit

Function CityForecast(City As String) As String
Dim StartingURL As String
Dim SecondaryURL As String
Dim FinalURL As String
Dim CorrectedCity As String
Dim objXML As Object
Dim objDOM As MSXML2.DOMDocument60

CorrectedCity = Replace(City, " ", "+")
CorrectedCity = Replace(City, ",", "+")

StartingURL = "http://api.openweathermap.org/data/2.5/forecast/daily?q="
SecondaryURL = "&mode=xml&units=metric&cnt=7"
FinalURL = StartingURL + CorrectedCity + SecondaryURL
Debug.Print FinalURL

Set objXML = CreateObject("MSXML2.XMLHTTP")
Set objDOM = New MSXML2.DOMDocument60

With objXML
    .Open "GET", FinalURL, False
    .setRequestHeader "Content-Type", "application/x-www-form-URLEncoded"
    .send
    objDOM.LoadXML .responseText
End With


End Function

Function CorrectedDate(WxDate As String) As String
Dim yr As Integer
Dim dy As Integer
Dim mnth As Integer

yr = Left(WxDate, 4)
mnth = Right(Left(WxDate, 7), 2)
dy = Right(WxDate, 2)

CorrectedDate = mnth & "/" & dy & "/" & yr
End Function

【问题讨论】:

  • 使用 xpath 应该很容易,我想...给我一些测试一下。

标签: xml vba excel openweathermap


【解决方案1】:

试试这样的。我使用了 DOMDocument 而不是 DOMDocument60,这对我来说是一个错误。您可能不需要更改该变量,但我做了。

这个函数也被修改为接受变量预测,daysOut。因此,如果您想要从今天开始(包括今天)第三天的预测,请执行以下操作:

=CityForecast("Boston, MA", 3)

代码如下:

Option Explicit

    Function CityForecast(City As String, daysOut As Integer) As String
    Dim StartingURL As String
    Dim SecondaryURL As String
    Dim FinalURL As String
    Dim CorrectedCity As String
    Dim objXML As Object
    Dim objDOM As MSXML2.DOMDocument  '### Changed
    'new variables I added:
    Dim precip As IXMLDOMNode


    CorrectedCity = Replace(City, " ", "+")
    CorrectedCity = Replace(City, ",", "+")

    StartingURL = "http://api.openweathermap.org/data/2.5/forecast/daily?q="
    SecondaryURL = "&mode=xml&units=metric&cnt=7"
    FinalURL = StartingURL + CorrectedCity + SecondaryURL
    Debug.Print FinalURL

    Set objXML = CreateObject("MSXML2.XMLHTTP")
    Set objDOM = CreateObject("MSXML2.DOMDocument")   '### Changed

    With objXML
        .Open "GET", FinalURL, False
        .setRequestHeader "Content-Type", "application/x-www-form-URLEncoded"
        .send
        objDOM.LoadXML .responseText
    End With

    'Use xpath to get the appropriate precipitation detail
    Set precip = objDOM.SelectSingleNode("/weatherdata/forecast/time[" & daysOut & "]/precipitation")


    If precip Is Nothing Then 
    ' in the event that the node doesn't exist
        CityForecast = "n/a" 
    Else
    ' otherwise, return the forecast attribute (0):
        If precip.Attributes.Length = 0 then
            CityForecast = 0
        Else
            CityForecast = precip.Attributes(0).nodeTypedValue
        End IF
    End If

    Set objXML = Nothing
    Set objDOM = Nothing

    End Function

【讨论】:

  • 这太棒了,我做了一些改动以获得 precip 类型。我注意到的一件事是,有时它不起作用,但是当我在 Web 浏览器中打开 XML 时它就起作用了……有没有办法解决这个问题,它总是起作用?
  • 函数输出#VALUE!。它似乎是命中或错过。我对 Google 地图 API 有同样的问题。但是当我打开 IE 并查看 XML 时,Excel 中的功能突然起作用了。
  • 那么你将需要一些额外的调试。只要在函数执行过程中遇到 any 错误,所有函数都会返回该错误。使用 XML 解析,可能会出现很多问题......我会做一个小修改,可能会有所帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-11-30
  • 2019-06-21
  • 1970-01-01
  • 1970-01-01
  • 2013-08-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多