Мне трудно понять, как правильно обрабатывать ответ XML в Visual Basic. Я случайно запущен Visual Studio 2013. ответа я получаю от API я выгляжу точно так же поиск информации, как это (некоторые данные изменены, чтобы защитить невинные):Анализ XML в Visual Basic
<?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
Я знаю, какие элементы существуют (или должны быть там), но не могут ссылаться на них напрямую, независимо от того, что я пытаюсь.
Это было слишком просто. Спасибо, сэр, работал как чемпион. Я знал, что мне не хватает чего-то фундаментального. – BigMikeL