2015-05-08 50 views
1

如何使用XDocument和Dictionary解析VB.net(2008)中重複的XML子行值。在下面的代碼我能讀到的一切下降到第一行用戶羣組.. 隱藏複製代碼 我得到的第一行中的所有值:如何使用XDocument和Dictionary VB.net 2008從XML中讀取多個子行值

「XX1」「羣主」,「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>[email protected]</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

您可以嘗試使用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 
+0

@TheITMan有沒有更新?此外,不要忘記[接受](http://stackoverflow.com/help/someone-answers)答案 – har07