2016-01-18 1 views
2

Я переделал этот вопрос, поскольку некоторые из них предположили, что трудно понять, что я делаю после этого, поэтому немного урезали вопрос.VB.NET Loop Through XML Результаты

<?xml version="1.0"?> 
<root> 
    <succesfulResponses> 
     <position>0</position> 
     <response> 
      <dln>BBUTU204250VS9VT</dln> 
      <licence> 
       <entitlements> 
        <code>A</code> 
        <validFrom/> 
        <validTo/> 
        <priorTo>false</priorTo> 
        <type>F</type> 
       </entitlements> 
       <entitlements> 
        <code>B</code> 
        <validFrom/> 
        <validTo/> 
        <priorTo>false</priorTo> 
        <type>F</type> 
       </entitlements> 
      </licence> 
     </response> 
    </succesfulResponses> 
    <succesfulResponses> 
     <position>1</position> 
     <response> 
      <dln>BTXRS755313Y99AT</dln> 
      <licence>   
       <entitlements> 
        <code>A</code> 
        <validFrom>2003-02-28</validFrom> 
        <validTo>2043-05-30</validTo> 
        <priorTo>false</priorTo> 
        <type>P</type> 
       </entitlements> 
       <entitlements> 
        <code>AM</code> 
        <validFrom>2014-05-14</validFrom> 
        <validTo>2043-05-30</validTo> 
        <priorTo>false</priorTo> 
        <type>P</type> 
       </entitlements> 
      </licence> 
      <httpStatusCode>200</httpStatusCode> 
     </response> 
    </succesfulResponses> 
</root> 

Это XML, который я вернул, я передаю несколько идентификаторов службе и возвращает этот XML.

Если я отправляю 2 идентификатора, он возвращает 2 'успешных элемента Responses' для каждого идентификатора, который вы можете видеть в дочернем узле 'dln' под ответом ', вы можете видеть, что они разные.

«Позиция» - это просто идентификатор, который я представил в «запросе» первым. «response» также имеет элемент под названием «лицензия» и несколько элементов «права».

Я хотел бы вставить эти «» пособий в DataTable, отформатированный таким образом

Results.EntitlementsTbl.Columns.Add(New DataColumn("Code", GetType(String))) 
    Results.EntitlementsTbl.Columns.Add(New DataColumn("Valid From", GetType(String))) 
    Results.EntitlementsTbl.Columns.Add(New DataColumn("Valid To", GetType(String))) 
    Results.EntitlementsTbl.Columns.Add(New DataColumn("Prior To", GetType(String))) 
    Results.EntitlementsTbl.Columns.Add(New DataColumn("Type", GetType(String))) 
    Results.EntitlementsTbl.Columns.Add(New DataColumn("Driver", GetType(String))) 

Каждый столбец относится к узлу под каждым элементом 'Entitlements. Я хочу добавить новую строку в мой datatable каждый раз, когда у меня есть элемент «права».

Существует дополнительная колонка «Драйвер», это должно быть заполнено номером в «положении».

Так что мой вывод к моему столу, я хотел бы иметь следующее:

Как вы можете видеть, что «Driver» Столбец относится к значению узла «позиции».

Надеюсь, это имеет больше смысла, чем мое предыдущее. Я удалил какой-либо из своих собственных кодов, о которых я сказал, что сделал это явно не то, что требовалось.

+2

Вы считали десериализацию своих объектов JSON для .net? Кажется, что много накладных расходов для преобразования в Xml и запроса. – Filburt

+0

@Filburt Я бы не знал, с чего начать там, я боюсь - я очень самоучкой в ​​том, что знаю, поэтому все это для меня. – Lynchie

+1

Отъезд [VB.net JSON Deserialize] (http://stackoverflow.com/q/8118019/205233) - он должен вас начать. – Filburt

ответ

3

Я бы от души второй рекомендации десериализации JSON непосредственно в CLR Object, и вы также можете найти его проще использовать XDocument API, но если вы действительно должны использовать XmlDocument модели по какой-то причине, этот код должен помочь

Dim DriverNo As String 

Using nodes As XmlNodeList = xmlDoc.DocumentElement.SelectNodes("/root/succesfulResponses") 
    For Each node In nodes 
     Dim DLN As String = "" 
     DriverNo = node.SelectSingleNode("position").InnerText 
     DLN = node.SelectSingleNode("response/dln").InnerText.ToString() 

     Using entitlements As XmlNodeList = node.SelectNodes("response/licence/entitlements") 
      For Each entitlement In entitlements 
       Dim code, validFrom, validTo, priorTo, type As String 
       code = entitlement.SelectSingleNode("code").InnerText 
       validFrom = entitlement.SelectSingleNode("validFrom").InnerText 
       validTo = entitlement.SelectSingleNode("validTo").InnerText 
       priorTo = entitlement.SelectSingleNode("priorTo").InnerText 
       type = entitlement.SelectSingleNode("type").InnerText 
       ' do what you need to with the variables here 
      Next 

     End Using 

    Next 
End Using 

Таким образом, вы перебор каждого successfulResponses узла захвата дина и DriverNo, а затем перебора каждого entitlements и получить данные оттуда. Это приведет к одному ряду на каждое право.

do what you need to with the variables here будет вашим фактическим кодом для вставки в ваш тип данных или что бы вы ни использовали.

+0

Hi Dan, Топ-человек, который разобрал то, что мне было нужно, я обязательно буду рассматривать JSON для объекта CLR, но это новая кривая обучения и то, что у меня сейчас нет времени. – Lynchie

0

Try XML Linq

Imports System.Xml 
Imports System.Xml.Linq 
Module Module1 
    Const FILENAME As String = "c:\temp\test.xml" 
    Sub Main() 

     Dim doc As XDocument = XDocument.Load(FILENAME) 

     Dim results = doc.Descendants("succesfulResponses").Select(Function(x) New With { _ 
      .position = CType(x.Element("position"), Integer), _ 
      .entitlements = x.Descendants("entitlements").Select(Function(y) New With { _ 
           .code = CType(y.Element("code"), String), _ 
           .validFrom = y.Elements("validFrom").Where(Function(z) z.Value.Length > 0).Select(Function(a) CType(a, DateTime)).FirstOrDefault(), _ 
           .validTo = y.Elements("validTo").Where(Function(z) z.Value.Length > 0).Select(Function(a) CType(a, DateTime)).FirstOrDefault(), _ 
           .priorTo = y.Elements("priorTo").Where(Function(z) z.Value.Length > 0).Select(Function(a) CType(a, Boolean)).FirstOrDefault(), _ 
           .type = y.Elements("type").Where(Function(z) z.Value.Length > 0).Select(Function(a) CType(a, String)).FirstOrDefault() _ 
           }).ToList() _ 
     }).ToList() 

    End Sub 

End Module 
+0

Отказоустойчивый кошмар. – Neolisk

+0

Что не так с кодом. Он используется все время, особенно в C#. Код работает так, что нужно отлаживать? – jdweng

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

  • Нет связанных вопросов^_^