简体   繁体   English

如何使用XDocument和Dictionary VB.net 2008从XML读取多个子行值

[英]How to read multiple sub row values from XML using XDocument and Dictionary VB.net 2008

How do you parse repeating XML sub row values in VB.net (2008) using XDocument, and Dictionary. 如何使用XDocument和Dictionary分析VB.net(2008)中重复的XML子行值。 In the code below I am able to read everything down to first row of userGroup.. Hide Copy Code I get all the values for the FIRST row: 在下面的代码中,我可以读取所有内容直到userGroup的第一行。隐藏复制代码我获得FIRST行的所有值:

"XX1" "MAIN GROUP" "111" "NORMAL" "/AAA/XX1/NANA" “ XX1”“ MAIN GROUP”“ 111”“ NORMAL”“ / AAA / XX1 / NANA”

I don't know how to loop through the remaining userGroup rows to get the rest of the values. 我不知道如何遍历其余的userGroup行以获得其余的值。 I need ALL of the values from ALL of the rows starting with 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"/>

There could be 1 to many userGroup rows. 可能有1到许多userGroup行。 My goals is to be able to read all values and store them into local variables. 我的目标是能够读取所有值并将其存储到局部变量中。

Example: Reading all orgCode values from userGroup row(s) and storing them concatenated in a local string variable. 示例:从userGroup行中读取所有orgCode值,并将它们串联存储在本地字符串变量中。

strLocal_VARIABLE_All_orgCodes = "111, ABC-123, QRX-567, BB1" strLocal_VARIABLE_All_orgCodes =“ 111,ABC-123,QRX-567,BB1”

Sample Code: 样例代码:

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

Thanks 谢谢

You can try using GroupBy() and String.Join() to get concatenated value of all attributes with the same name : 您可以尝试使用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

Relevant part of the output : 输出的相关部分:

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM