2013-06-04 40 views
0

多個值我有一些XML的文件與標記是這樣的:選擇從XML的XDocument(VB.NET)

<?xml version="1.0" encoding="ISO-8859-1"?> 
<clients> 
    <client id="00000" name="Donald Duck"> 
     <group id="AAA" name="ClientInfo"> 
      <term id="Sex">Male</term> 
      <term id="Status">In a relationship</term> 
     </group> 
     <group id="BBB" name="ClientTelephoneNumbers"> 
      <term id="Home">0000-0000000</term> 
      <term id="Cell">1111-1111111</term> 
     </group> 
     <group id="CCC" name="WorkingStatus"> 
      <term id="HasAJob">Yes</term> 
      <term id="Where">Somewhere</term> 
     </group> 
    </client> 
    <client id="11111" name="Daisey Duck"> 
     <group id="AAA" name="ClientInfo"> 
      <term id="Sex">Female</term> 
      <term id="Status">In a relationship</term> 
     </group> 
     <group id="BBB" name="ClientTelephoneNumbers"> 
      <term id="Home">2222-2222222</term> 
      <term id="Cell">3333-3333333</term> 
     </group> 
     <group id="CCC" name="WorkingStatus"> 
      <term id="HasAJob">Unknown</term> 
      <term id="Where">Unknown</term> 
     </group> 
    </client> 
</clients> 

什麼我想要做的只是選擇一些這些值輸出。

如果我有這樣的代碼:

Dim xml As XDocument = Xdocument.Load(ducks.xml) 
For Each Duck As XElement in xml.Descendants("client") 
    Dim Name As String = Duck.Attribute("Name").Value 
Next 

我得到了鴨子的姓名(或名稱),但比方說,我想要得到的手機號碼,家庭電話號碼和狀態,我怎麼能那麼從屬性等於某個元素的元素中獲取值?

在實際情況下,組ID:s更復雜,所以我寧願不必計數元素,我想通過它們的元素屬性來選擇它們。像這樣:

Dim xml As XDocument = Xdocument.Load(ducks.xml) 
For Each Duck As XElement in xml.Descendants("client") 
    Dim Name As String = Duck.Attribute("Name").Value 
    Dim Cellphone As string = Duck.Element("group WHERE id IS BBB").Element("term WHERE id IS Cell").Value 
    Dim Homephone As string = Duck.Element("group WHERE id IS BBB").Element("term WHERE id IS Home").Value 
Next 

我已經嘗試了一些查詢,但不能真正得到它的竅門。有什麼建議麼?

編輯注:這不是我在Duck.Element查詢或一些有真正的嘗試(「嗒嗒WHERE嗒嗒」),這只是描述我想要什麼......

回答

0

下面是一個例子:

Dim v = From clt In xml.<client> 
     Where [email protected] = "Donald Duck" 
     Select cellPhone = clt...<term>.Where(Function(x) [email protected] = "Cell").Value, 
       homePhone = clt...<term>.Where(Function(x) [email protected] = "Home").Value, 
       status = clt...<term>.Where(Function(x) [email protected] = "Status").Value 

工程爲您的測試案例:

Dim xml = <clients> 
      <client id="00000" name="Donald Duck"> 
       <group id="AAA" name="ClientInfo"> 
       <term id="Sex">Male</term> 
       <term id="Status">In a relationship</term> 
       </group> 
       <group id="BBB" name="ClientTelephoneNumbers"> 
       <term id="Home">0000-0000000</term> 
       <term id="Cell">1111-1111111</term> 
       </group> 
       <group id="CCC" name="WorkingStatus"> 
       <term id="HasAJob">Yes</term> 
       <term id="Where">Somewhere</term> 
       </group> 
      </client> 
      <client id="11111" name="Daisey Duck"> 
       <group id="AAA" name="ClientInfo"> 
       <term id="Sex">Female</term> 
       <term id="Status">In a relationship</term> 
       </group> 
       <group id="BBB" name="ClientTelephoneNumbers"> 
       <term id="Home">2222-2222222</term> 
       <term id="Cell">3333-3333333</term> 
       </group> 
       <group id="CCC" name="WorkingStatus"> 
       <term id="HasAJob">Unknown</term> 
       <term id="Where">Unknown</term> 
       </group> 
      </client> 
      </clients> 

編輯:您可以檢查在調試器什麼v

enter image description here

+0

那麼,現在這東西存儲在「v」,我猜?我現在怎麼打印出手機號碼? Console.WriteLine(v。?)? – gubbfett

+1

@gubbfett:'v'是對象的集合 - 請參閱我的編輯。可能你可以有多個對象。在當前的例子中,當然只有一個。所以你可以寫'Console.WriteLine(v(0).cellPhone)'。理想情況下,你會有一個循環,通過這個集合。 – Neolisk

+1

非常感謝! :) – gubbfett