2011-11-15 5 views
0

반복적으로이 작업을 수행 할 수 있지만 단일 LINQ 문에서 수행하는 것이 좋습니다. XML에 대한 하나의 LINQ에서 가능성이계층 적 LINQ to XML 쿼리를 수행하는 방법?

<parent name="george"> 
    <child name="steve" age="10" /> 
    <child name="sue" age="3" /> 
    <pet type="dog" /> 
    <child name="jill" age="7" /> 
</parent> 
<!-- ... --> 

나는

<node type="parent" label="george"> 
    <node type="child" label="steve" years="10 /> 
    <node type="child" label="sue" years="3" /> 
    <node type="child" label="jill" years="7" /> 
    <!-- no pets! --> 
</parent> 
<!-- ... --> 

로를 설정하는 XML 문에 LINQ를 작성하려면 :

나는 다음과 같습니다 일부 XML을 성명서?

두 개의 from 문을 LINQ 문에 포함했으나 두 번째 문단은 select이 아닙니다.

+0

그래서 변환 된 XML은'pet' 노드 또는 만 가능한 경우는 포함되지해야합니까? –

+0

다음에서 몇 가지 지침을 얻을 수 있습니다. http://msdn.microsoft.com/en-us/library/bb675178.aspx (XPath 사용자의 경우 LINQ to XML) –

+0

죄송합니다. 애완 동물은 관련성이 없습니다. 나는 샘플 코드를 너무 복잡하게 만들었다. –

답변

3

원하는 요소를 쿼리하고 쿼리 된 항목을 사용하여 새 요소와 특성을 만들어야합니다. 이런 식으로 뭔가 작업을해야합니다 :

var input = @"<root> 
    <parent name=""george""> 
     <child name=""steve"" age=""10"" /> 
     <child name=""sue"" age=""3"" /> 
     <pet type=""dog"" /> 
     <child name=""jill"" age=""7"" /> 
    </parent> 
</root>"; 

var xml = XElement.Parse(input); 
var query = from p in xml.Elements("parent") 
      select new XElement("node", 
       new XAttribute("type", p.Name), 
       new XAttribute("label", p.Attribute("name").Value), 
       from c in p.Elements("child") 
       select new XElement("node", 
        new XAttribute("type", c.Name), 
        new XAttribute("label", c.Attribute("name").Value), 
        new XAttribute("years", c.Attribute("age").Value))); 
+0

그게 전부입니다. 나는 그런 식으로하려고했지만 잘못된 구문이 있다고 생각합니다. 감사! –

+0

@Jim 저의 기쁨 :) –

1

는 신속하고 더러운 :

doc.Elements("parent") 
      .Select(p => 
       new XElement("node", 
         new XAttribute("type", p.Name), 
         new XAttribute("label", p.Attribute("name") != null ? p.Attribute("name").Value : ""), 
         p.Elements("child") 
          .Select(c => 
            new XElement("node", 
            new XAttribute("type", c.Name), 
            new XAttribute("label", c.Attribute("name") != null ? c.Attribute("name").Value : ""), 
            new XAttribute("years", c.Attribute("age") != null ? c.Attribute("age").Value : "")) 
           ) 
         ) 
       );