Как получить информацию от других вложенных элементов? - PullRequest
0 голосов
/ 10 февраля 2011

Я борюсь с использованием LINQ для 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}.

Но мне нужно получить больше информации. Как я могу получить Value элемента Variable с ID="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.

Ответы [ 2 ]

2 голосов
/ 10 февраля 2011

Если у вас есть ссылка на определенный элемент, вы можете получить значения из любого из его вложенных элементов, используя методы 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()
           };
1 голос
/ 10 февраля 2011

Как только у вас есть и 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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...