如何使用XDocument和Dictionary解析VB.net(2008)中重复的XML子行值。在下面的代码中,我能够读取到userGroup第一行的所有内容。 隐藏复制代码 我得到第一行的所有值:
" XX1" " MAIN GROUP" " 111" "师范大学" " / 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 =&#34; 111,ABC-123,QRX-567,BB1&#34;
示例代码:
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
由于
答案 0 :(得分:0)
您可以尝试使用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