2015-05-20 21 views
3

Мне трудно понять, как правильно обрабатывать ответ 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 

Я знаю, какие элементы существуют (или должны быть там), но не могут ссылаться на них напрямую, независимо от того, что я пытаюсь.

ответ

1
Dim xDoc as XMLDocument 
xDoc.Load("C:\temp\file.xml") 

Dim s as string = xDoc.SelectSingleNode("person/hos-status/availability/Shift").InnerText 
+0

Это было слишком просто. Спасибо, сэр, работал как чемпион. Я знал, что мне не хватает чего-то фундаментального. – BigMikeL

2

Вы должны быть в состоянии использовать что-то вроде этого:

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

Однако одна из хороших вещей о VB.NET является его встроенная поддержка XML, используя System.Xml.Linq классы, такие как XElement. Это позволит вам сделать что-то подобное, что для меня гораздо читаемо (вам нужно будет разобраться, как интегрироваться в ваш код):

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

Я не имел понятия о классах Linq. Я обязательно посмотрю их. Еще один отличный ответ. – BigMikeL

Смежные вопросы