2011-11-15 19 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を持っていますステートメント?

2つのfromステートメントはLINQステートメントには含まれていますが、これには2番目のものは含まれていません。selectが必要です。

+0

ので、変換されたXMLは、 'pet'ノードを含めるべきではない、またはそれが利用できる場合にのみ? –

+0

あなたはこれからいくつかの指針を得るでしょう。http://msdn.microsoft.com/en-us/library/bb675178.aspx(LINQ to XML for XPath Users) –

+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 : "")) 
           ) 
         ) 
       ); 
関連する問題