2011-02-09 67 views
0

我正在努力使用LINQ to SQL XML。我正在遵循示例並獲得一些好的結果。然而,我遇到了一個問題,希望有人能幫助我。如何從其他嵌套元素獲取信息?

<root> 
<MyItem Host="00155DFF045C" LastName="HOUSTON" FirstName="WHITNEY" > 
    <TimeStamp ComputerTime="02/07/2011 - 21:41:53.715"> 
     <Group Name="Group1"> 
      <Variable ID="1001" Value="Happy" > 
      </Variable> 
     </Group> 
     <Group Name="Group2"> 
      <Variable ID="2000" Value="Monday" > 
      </Variable> 
      <Variable ID="2001" Value="Tuesday" > 
      </Variable> 
     </Group> 
     <Group Name="Group3"> 
      <Variable ID="3000" Value="January" > 
      </Variable> 
      <Variable ID="3001" Value="February" > 
      </Variable> 
     </Group> 
     <Group Name="Groupe4"> 
      <Variable ID="4001" Value="108.000000" > 
      </Variable> 
      <Variable ID="4002" Value="800" > 
      </Variable> 
     </Group> 
     <Group Name="CustomGroup"> 
      <Variable ID="1001000" Value="1.000000" > 
      </Variable> 
     </Group> 
    </TimeStamp> 
</MyItem> 
<MyItem> 
... 
... 
</MyItem> 
</root> 

我正確地得到這樣{Host="00155DFF045C" LastName="HOUSTON" FirstName="WHITNEY}感謝教程信息。

但我需要獲得更多信息。如何檢索變量元素ValueID="4001"屬於Groupe4

我當前的代碼是:

XElement xmlTweets = XElement.Parse(e.Result); 
var toto = from tweet in xmlTweets.Descendants("MyItem").Take(10) 
      orderby tweet.Element("TimeStamp").Attribute("ComputerTime").Value descending 
      select new History { 
       DisplayName = tweet.Attribute("PatientFirstName").Value + " " + 
          tweet.Attribute("PatientLastName").Value 
      }; 

有了這個代碼,我可以正確得到價值DisplayName。我想獲得變量4001的值,即值108.0000

+0

你有任何代碼寫下來這麼遠?它會幫助你知道如何去做,更容易做到。 – 2011-02-09 22:45:21

+0

嗨,傑夫,我只是更新我最初的poste與我目前的代碼。希望你能幫助我:) – terry 2011-02-09 23:16:21

回答

2

如果您有對特定元素的引用,則可以使用Element()Attribute()方法從其任何嵌套元素中獲取值。您可以使用Elements()Attributes()來獲取這些列表,以對它們執行LINQ查詢。假設我們的根元素的引用,你可以得到以下信息:

XElement root = ...; 
XElement myItem = root.Element("MyItem");    // get the first "MyItem" element 
string Host = myItem.Attribute("Host").Value;   // get value of "Host" attribute 
string LastName = myItem.Attribute("LastName").Value; // get value of "LastName" attribute 
string FirstName = myItem.Attribute("FirstName").Value; // get value of "FirstName" attribute 

// find "Groupe4" 
XElement Groupe4 = (from g in myItem.Element("TimeStamp") 
            .Elements("Group") 
        where g.Attribute("Name").Value == "Groupe4" 
        select g) // only one element should be found 
        .Single(); // assign that element to variable Groupe4 

// Get Value of Variable with ID = 4001 
double Value4001 = (from v in Groupe4.Elements("Variable") // of all Variable elements 
        where (int)v.Attribute("ID") == 4001 // choose elements where ID = 4001 
        select (double)v.Attribute("Value")) // select the Value 
        .Single();        // assign that value to variable Value 4001 

因此,要應用,爲您的查詢,你可以做這樣的事情:

XElement xmlTweets = XElement.Parse(e.Result); 
var id = 4001; // the ID to find 
var toto = from tweet in xmlTweets.Descendants("MyItem") 
            .Take(10) 
      orderby (DateTime)tweet.Element("TimeStamp") 
            .Attribute("ComputerTime") descending 
      select new History { 
       DisplayName = String.Format("{0} {1}", 
        tweet.Attribute("PatientFirstName").Value, 
        tweet.Attribute("PatientLastName").Value), 

       // find the Variable with matching ID and get its Value as a double 
       Value = (from v in tweet.Descendants("Variable") 
         where (int)v.Attribute("ID") == id 
         select (double)v.Attribute("Value")) 
         .Single() 
      }; 
0

一旦你和XElement變量命名爲myItemElement

 myItemElement 
      .Element("TimeStamp") 
      .Elements("Group") 
      .FirstOrDefault(x => x.Attribute("Name") != null && x.Attribute("Name").Value == "Groupe4") 
      .Elements("Variable") 
      .FirstOrDefault(x => x.Attribute("ID") != null && x.Attribute("ID").Value == "4001") 
      .Attribute("Value").Value;