我已经重做了这个问题,因为有些人认为很难理解我的意思,所以在某种程度上减少了这个问题。
<?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;位置的价值。节点
我希望这比我以前更有意义。我已经删除了我所说的我已经完成的任何代码,因为它显然不是所需要的。
答案 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