Linq to XML - что не так с моим запросом - PullRequest
0 голосов
/ 01 февраля 2011

У меня есть этот XML-документ (и нет, я не составлял эту схему).

<?xml version="1.0" encoding="utf-8" ?>
<rsp stat="ok">
<wmversion>3</wmversion>
<summary day="362" >
  <item key="SomeAttribute">
    <item key="1">0.33</item>
    <item key="10">3.32</item>
    <item key="11">0.23</item>
    <item key="12">1.06</item>
    <item key="13">0.09</item>
    <item key="2">0.35</item>
    <item key="3">0.72</item>
    <item key="4">0.61</item>
    <item key="5">1.01</item>
    <item key="6">0.10</item>
    <item key="7">0.50</item>
    <item key="8">1.27</item>
    <item key="9">3.01</item>
  </item>
...

Теперь я пытаюсь запросить эту информацию, как:

XDocument doc = XDocument.Load(@"C:\Test.xml");
var q = from d in doc.Descendants("summary")
        where d.Element("item").Attribute("key").Value == "SomeAttribute"
        select new { LengendKey = d.Attribute("key").Value, ElapsedTime = d.Element("item").Value };

Я возвращаю 0 пунктов вместо списка. Кто-нибудь знает, что я здесь не так делаю?

Спасибо, Билл Н

Ответы [ 3 ]

0 голосов
/ 01 февраля 2011

Это работает:

var q = doc.Descendants("summary").Descendants("item").Descendants("item")
    .Select ( d => new { LengendKey = d.Attribute("key").Value, ElapsedTime = d.Value });
0 голосов
/ 01 февраля 2011

Полагаю, не совсем понятно, что вы пытаетесь сделать.

var q = from d in doc.Descendants("summary")
where d.Element("item").Attribute("key").Value == "SomeAttribute"
select new { LengendKey = d.Attribute("key").Value, ElapsedTime = d.Element("item").Value }

В вашем коде здесь d - это все потомки "summary", которые сами имеют элемент "item" справильный атрибут.

В опубликованном вами XML-файле есть только 1 потомок 'summary', и у него нет дочерних элементов 'item' с правильным атрибутом.

Я также запуталсяо строке LengendKey = d.Attribute("key").Value, ElapsedTime = d.Element("item").Value - здесь d предполагается для конечного узла (который имеет ключ 1, 2, 3 и т. д.) - который будет соответствовать первой части оператора, или родительского узла, который имеет элементы 'item'под ним - что соответствует второй части утверждения?Это не может быть и то и другое одновременно.

Вы, вероятно, хотите

// first get the summary; it is a descendant of doc & there's only one.
var summary = doc.Descendants("summary").Single();

// get the element with 'SomeAttribute' from the summary;
// if there's only even going to be one then you can call Single here
var item = summary.Elements().Single(e => e.Name == "item" 
    && e.Attribute("key").Value == "SomeAttribute");

var q = item.Elements().Select(e => new 
    { LengendKey = e.Attribute("key").Value, ElapsedTime = e.Value });
0 голосов
/ 01 февраля 2011
var q = doc.Descendants("summary")
           .Where(x => x.Element("item").Attribute("key").Value == "SomeAttribute")
           .SelectMany(x => x.Descendants())
           .Select( x => new  
               { LengendKey = x.Attribute("key").Value, ElapsedTime = x.Value  });

Это работает для вас? Или вы ищете что-то еще?

...