[英]How to read multiple sub row values from XML using XDocument and Dictionary VB.net 2008
如何使用XDocument和Dictionary分析VB.net(2008)中重复的XML子行值。 在下面的代码中,我可以读取所有内容直到userGroup的第一行。隐藏复制代码我获得FIRST行的所有值:
“ XX1”“ MAIN GROUP”“ 111”“ NORMAL”“ / AAA / XX1 / NANA”
我不知道如何遍历其余的userGroup行以获得其余的值。 我需要从以userGroup开始的所有行中的所有值。
<userGroup id="XX1" title="MAIN GROUP" orgCode="111" type="NORMAL" fullPath="/AAA/XX1/NANA"/>
<userGroup id="ABC" title="Test Group1" orgCode="ABC-123" type="NORMAL" fullPath="/ABC/"/>
<userGroup id="XX2" title="Test Group2" orgCode="QRX-567" type="NORMAL" fullPath="/AAA/XX2/"/>
<userGroup id="XX5" title="Test Group3" orgCode="BB1" type="NORMAL" fullPath="/AAA/XX5/BB1"/>
可能有1到许多userGroup行。 我的目标是能够读取所有值并将其存储到局部变量中。
示例:从userGroup行中读取所有orgCode值,并将它们串联存储在本地字符串变量中。
strLocal_VARIABLE_All_orgCodes =“ 111,ABC-123,QRX-567,BB1”
样例代码:
Private Sub Button5_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button5.Click
Dim result = ParseXML()
For Each key1 In result.Keys
Console.WriteLine(key1 & " --> " & result(key1))
Next
End Sub
Function ParseXML() As Dictionary(Of String, String)
Dim parseValues = New Dictionary(Of String, String)
Dim doc As XDocument = <?xml version="1.0" encoding="UTF-8"?>
<sslms status="ok" time="0">
<user username="123456" activated="true" userRole="END_USER" isCustomUser="false" selfReg="false" regDate="2015-01-17T20:08:30Z" siteLanguage="en-US" searchLanguage="en">
<profileFieldValues>
<fieldValue id="_sys_firstname">
<value>John</value>
</fieldValue>
<fieldValue id="_sys_lastname">
<value>Doe</value>
</fieldValue>
<fieldValue id="_sys_emailaddress">
<value>JDoe@someplace.net</value>
</fieldValue>
<fieldValue id="_sys_display_first_name">
<value>John</value>
</fieldValue>
<fieldValue id="_sys_display_last_name">
<value>Doe</value>
</fieldValue>
<fieldValue id="_sys_location">
<value/>
</fieldValue>
<fieldValue id="_sys_image_url">
<value/>
</fieldValue>
<fieldValue id="ccnumber">
<value>NO</value>
</fieldValue>
</profileFieldValues>
<userGroup id="XX1" title="MAIN GROUP" orgCode="111" type="NORMAL" fullPath="/AAA/XX1/NANA"/>
<userGroup id="ABC" title="Test Group1" orgCode="ABC-123" type="NORMAL" fullPath="/ABC/"/>
<userGroup id="XX2" title="Test Group2" orgCode="QRX-567" type="NORMAL" fullPath="/AAA/XX2/"/>
<userGroup id="XX5" title="Test Group3" orgCode="BB1" type="NORMAL" fullPath="/AAA/XX5/BB1"/>
</user>
</sslms>
For Each attr In doc.Element("sslms").Attributes()
parseValues.Add("sslms_" & attr.Name.ToString, attr.Value)
Next
For Each attr In doc.Element("sslms").Element("user").Attributes()
parseValues.Add("user_" & attr.Name.ToString, attr.Value)
Next
For Each ele In doc.Element("sslms").Element("user").Element("profileFieldValues").Elements("fieldValue")
parseValues.Add(ele.Attributes.First.Value.ToString, ele.Element("value").Value)
Next
For Each attr In doc.Element("sslms").Element("user").Element("userGroup").Attributes()
parseValues.Add("userGroup_" & attr.Name.ToString, attr.Value)
Next
Return parseValues
End Function
谢谢
您可以尝试使用GroupBy()
和String.Join()
来获取具有相同名称的所有属性的串联值:
For Each attr In doc.Element("sslms").
Element("user").
Elements("userGroup").
Attributes().
GroupBy(Function(x) x.Name.ToString())
parseValues.Add("userGroup_" & attr.Key, String.Join(",", attr.Select(Function(x) x.Value)))
Next
输出的相关部分:
userGroup_id --> XX1,ABC,XX2,XX5
userGroup_title --> MAIN GROUP,Test Group1,Test Group2,Test Group3
userGroup_orgCode --> 111,ABC-123,QRX-567,BB1
userGroup_type --> NORMAL,NORMAL,NORMAL,NORMAL
userGroup_fullPath --> /AAA/XX1/NANA,/ABC/,/AAA/XX2/,/AAA/XX5/BB1
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.