gpt4 book ai didi

xml - 在 Visual Basic 中解析 XML

转载 作者:数据小太阳 更新时间:2023-10-29 02:26:11 25 4
gpt4 key购买 nike

我很难弄清楚如何在 Visual Basic 中“正确”解析 XML 响应。我碰巧正在运行 Visual Studio 2013。我从我正在查询的 API 获得的响应看起来完全像这样(一些数据已更改以保护无辜者):

<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<person id="123456">
<hos-status as-of="2015-05-20T18:53:39.592Z">
<duty-status>ON</duty-status>
<availability>
<drive>22020000</drive>
<shift>22020000</shift>
<cycle>151320000</cycle>
</availability>
<rest-break>
<max-drive>420000</max-drive>
<rest-remaining>1800000</rest-remaining>
</rest-break>
<daily-log-summary date="2015-05-20">
<duty-status code="OF">25200000</duty-status>
<duty-status code="SL">0</duty-status>
<duty-status code="DR">7800000</duty-status>
<duty-status code="ON">20580000</duty-status>
</daily-log-summary>
<daily-log-summary date="2015-05-19">
<duty-status code="OF">51600000</duty-status>
<duty-status code="SL">0</duty-status>
<duty-status code="DR">8580000</duty-status>
<duty-status code="ON">26220000</duty-status>
</daily-log-summary>
</hos-status>
<location as-of="2015-05-20T18:52:40.000Z">
<position lat="12.345678" lon="-12.345678" accuracy="3"/>
<speed>12</speed>
<bearing>123.45</bearing>
</location>
</person>

我可以解析它,但我这样做的方式肯定不直观。我花了几天时间阅读它,我所能找到的都是看起来和我正在做的一样丑陋的方法。显然,我遗漏了一些基本知识,我希望获得有关阅读内容的建议,以便我可以学习正确的方法。

这是我正在使用的代码/过程。首先,我调用 API 以通过以下函数获取响应:

Public Function getCurlXML(theURL As String) As Xml.XmlDocument
getCurlXML = New Xml.XmlDocument
Dim wHeader As WebHeaderCollection = New WebHeaderCollection()
wHeader.Clear()
Dim wRequest As HttpWebRequest = DirectCast(System.Net.HttpWebRequest.Create(theURL), HttpWebRequest)
wRequest.ContentType = "text/xml"
wRequest.Headers = wHeader
wRequest.Method = "GET"
Dim wResponse As HttpWebResponse = DirectCast(wRequest.GetResponse(), HttpWebResponse)
Dim sResponse As String = ""
Using srRead As New StreamReader(wResponse.GetResponseStream())
sResponse = srRead.ReadToEnd()
End Using
getCurlXML.LoadXml(sResponse)
End Function

下面是我用来调用上述函数并进行解析的代码:

Public Function getThePersonStatus(personID As String) As Collection
Dim statusColl As New Collection
Dim sUrl As String = "https://api.THE.com/api/stuffage/" & personID & "/status?apiKey=" & My.Settings.TheAPIKey
Dim doc As Xml.XmlDocument = getCurlXML(sUrl)
Dim statusElemList As XmlNodeList = doc.GetElementsByTagName("hos-status")
For Each thisNode As XmlNode In statusElemList
If (thisNode.Name = "hos-status") Then
statusColl.Add(thisNode.Attributes("as-of").Value.ToString, "hos-as-of")
statusColl.Add(thisNode("duty-status").InnerText.ToString, "duty-status")
Dim availElem As XmlNode = thisNode("availability")
statusColl.Add(availElem("drive").InnerText.ToString, "drive")
statusColl.Add(availElem("shift").InnerText.ToString, "shift")
statusColl.Add(availElem("cycle").InnerText.ToString, "cycle")
End If
Next
Dim locationElemList As XmlNodeList = doc.GetElementsByTagName("location")
For Each thisNode As XmlNode In locationElemList
statusColl.Add(thisNode.Attributes("as-of").Value.ToString, "loc-as-of")
statusColl.Add(thisNode("speed").InnerText.ToString, "speed")
statusColl.Add(thisNode("bearing").InnerText.ToString, "bearing")
statusColl.Add(thisNode("position").Attributes("lat").Value.ToString, "lat")
statusColl.Add(thisNode("position").Attributes("lon").Value.ToString, "lon")
statusColl.Add(thisNode("position").Attributes("accuracy").Value.ToString, "gps-accuracy")
Next
getThePersonStatus = statusColl
End Function

基本上,我根据响应创建一个 XML 文档,然后搜索我感兴趣的元素,然后遍历该元素以查找我感兴趣的子节点。

有没有一种方法可以加载文档并引用类似于以下形式的特定元素:

doc.Elem("person").Elem("hos-status").Elem("availability").Elem("Shift").InnerText

我知道那里(或应该那里)有哪些元素,但无论我尝试什么,似乎都无法直接引用它们。

最佳答案

你应该能够使用这样的东西:

doc.DocumentElement.Item("hos-status").Item("availability").Item("shift").InnerText

但是,VB.NET 的优点之一是它使用 System.Xml.Linq 类(例如 XElement)对 XML 的 native 支持。 .这将允许你做这样的事情,对我来说它更具可读性(你需要弄清楚如何集成到你的代码中):

Dim xml = XElement.Load(wResponse.GetResponseStream())
Dim shift = x.<hos-status>.<availability>.<shift>.Value

关于xml - 在 Visual Basic 中解析 XML,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30359041/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com