2011-02-01 3 views
0

이 XML 문서가 있습니다. (이 스키마는 작성하지 않았습니다.) 내가 0 항목 대신 목록을 반환하고있어Linq to XML - 내 검색어에 문제가 있습니까?

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 }; 

:

<?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> 
... 

지금 내가 좋아하는이 정보를 조회하기 위해 노력하고있어. 아무도 내가 여기서 뭘 잘못하고 있는지 알아?

감사합니다, 빌 N

답변

0

나는 당신이 뭘 하려는지 정말 분명하지 않다 같아요. 여기에 코드에서

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 자체가 올바른 속성을 가진 '항목'요소가 '요약'의 모든 후손이다.

게시 한 XML에는 'summary'의 하위 항목이 하나 뿐이며 올바른 속성을 가진 'item'하위 항목이 없습니다.

또한 LengendKey = d.Attribute("key").Value, ElapsedTime = d.Element("item").Value - 여기서는 리프 노드 (키 1, 2, 3 등이 있음) - d으로되어 있습니다. - 명령문의 첫 번째 부분 또는 부모 노드에 맞을 것으로 예상됩니다. 그 아래에있는 '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 }); 
을 원하는
1
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 }); 

당신을 위해이 일을합니까? 아니면 다른 것을 찾고 있습니까?

-1

이 작동 :

var q = doc.Descendants("summary").Descendants("item").Descendants("item") 
    .Select (d => new { LengendKey = d.Attribute("key").Value, ElapsedTime = d.Value });