VB.NET循环XML结果

时间:2016-01-18 15:17:21

标签: xml vb.net

我已经重做了这个问题,因为有些人认为很难理解我的意思,所以在某种程度上减少了这个问题。

<?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,我向服务提交了几个ID,并返回此XML。

如果我发送2个ID,则返回2&#39; successResponses&#39;每个ID的元素,您可以在子节点中看到这些ID&#39; dln&#39;在&#39;响应&#39;下,你可以看到它们是不同的。

&#39;位置&#39;只是我在“请求”中提交的ID。第一。 &#39;响应&#39;还有一个名为&#39; license&#39;和几个权利&#39;元件。

我希望插入这些&#39;权利&#39;进入以这种方式格式化的数据表

    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)))

每列与每个权利下面的节点相关联。元件。我希望每次有权利时都可以在我的数据表中添加一个新行#39;元件。

还有一个列&#39; Driver&#39;,这需要在&#39;位置&#39;中填入数字。

所以我输出到我的表我希望有以下内容:

正如你可以看到&#39; Driver&#39;专栏涉及&#39;位置的价值。节点

我希望这比我以前更有意义。我已经删除了我所说的我已经完成的任何代码,因为它显然不是所需要的。

2 个答案:

答案 0 :(得分:4)

我衷心地推荐将JSON直接反序列化为CLR对象,您可能也会发现使用XDocument API更容易,但如果您真的必须使用{{1模型由于某种原因,这段代码应该有帮助

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 节点,抓取DLN和DriverNo,然后遍历每个successfulResponses节点并从那里获取数据。这将导致每个权利一行。

entitlements将是您插入数据表或您正在使用的任何内容的实际代码。

答案 1 :(得分:0)

试试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