2009-08-04 27 views
17
Dim xml = <Root> 
      <Parent id="1"> 
       <Child>Thomas</Child> 
      </Parent> 
      <Parent id="2"> 
       <Child>Tim</Child> 
       <Child>Jamie</Child> 
      </Parent> 
      </Root> 

Dim parents = xml.Elements 

この場合、childrenには、すべての親要素とすべての子要素が含まれています。 直接子孫のみを取得するにはどうすればよいです<Root>LINQ to XML:XElementの直接子孫のみを取得するにはどうすればよいですか?

親= <Root>の要素を選択するLINQクエリを記述する必要がありますか?それとも私のためにこれを手に入れることができない欠点がある組み込み方法がありますか?

編集:XElement.ElementsXElement.Descendantsの間に混乱がありました。 Ruben Bartelink氏が指摘したように、XElement.Elementsは、私が探していたものを正確に教えてくれます。

+0

あなたが実際に使った言葉で編集できますか? BTWはLINQPAdをダウンロードして試してみてください。このようなものをテストするのに最適です。 http://www.dimecasts.net/Casts/ByTag/LinqPad –

答えて

17

Execの概要 - あなたが欲しい:

xml.Elements.Select(function(element) new XElement(element.Name,element.Attributes)) 

が最初の答え:

XElement.Descendants、またはそれはトリックの質問ですか? :P There's an example of usage of Descendants here

改訂答え、感謝トーモッド - あなたが探していると、何かが間違っ感じました!:

要素は、直接の子孫を与えます。子孫は完全な階層を与えます(あなたが要素がそうしているように)。 (私はこれを明確にするためにリンクされ、混乱のために謝罪を例

そうで、最終的には、あなたが探していることはVBで(この時間)です。!

Dim xml = <Root> 
     <Parent id="1"> 
      <Child>Thomas</Child> 
     </Parent> 
     <Parent id="2"> 
      <Child>Tim</Child> 
      <Child>Jamie</Child> 
     </Parent> 
     </Root> 

REM All nodes two levels down in the hierarchy 
Dim level2Nodes = xml.Elements.SelectMany(function(element) element.Elements) 
level2Nodes.Dump 

REM All Child nodes, no matter where they are: 
Dim children = xml.Descendants("Child") 

あなたが得られますそれぞれのREMでカバーとしてさまざまな理由から3 `` `要素

(VBステートメントモードでLINQPadに直接上記を貼り付け)

私は今あなたを混乱されるかもしれないものを見る - 。あなたは要素を使用する場合と見えますそれは視覚化装置で、あなたはまだ子どもたちを見て: - :それぞれのケースでは、次の2つの結果を得ていることを

Dim parentNames = xml.Elements.Select(function(element) element.Name) 

注意だけ実際の名前にしたい場合

Dim parents = xml.Elements 

、あなたがのようなものを使用することができます。

あなたが本当にchidrenを取り除くしたい場合は、希望:

Dim parentElements = xml.Elements.Select(function(element) new XElement(element.Name,element.Attributes)) 

はあなたが本当に探しているものを表示するようにあなたの質問を拡張することはできますか?

+3

のDescendants()メソッドは、直接の子孫だけでなく、すべての子孫を取得します。この場合、「ルート」の子孫にはすべての子要素も含まれます。 – Tormod

+0

@トルモド、本当に?例を参照してください?そうでない場合は、子孫と要素の違いは何ですか? –

+0

@Tormod、mea culpa、編集中! –

-1

なぜXPathを使用しないのですか?

Dim myXML As var = New XmlDocument() 
myXML.Load(myXML.xml) 

For Each node As XmlNode In myXML.SelectNodes("//") 
    Dim myVar As var = node.SelectSingleNode("Parent").InnerText 
Next 

私はちょうどC#からVBに変換しました。

+0

XLinqはそれなりにきちんとしています。[使い方を決めるときには、次のように使います:P] –

+1

かなり:P 私はそれを調べなければならないでしょう。 XLinqに! –

0

すべての直接子孫が同じ既知の要素名を持ち、この要素名を別のレベルに表示できない場合は、xml.Descendants( "Parent")を使用できます。

15

XElement.Elementsは、子要素のコレクションを取得します。たとえば...

var s = @"<root> 
      <e1> 
       <e2> 
       </e2> 
      </e1> 
      <e1> 
       <e2> 
       </e2> 
      </e1> 
      <e1> 
       <e2> 
       </e2> 
      </e1> 
      </root>"; 

var doc = XElement.Load(new StringReader(s)); 

Console.WriteLine(doc.Elements().Count()); // 3 
Console.WriteLine(doc.Descendants().Count()); //6 
2

Linqを使用して、これを行うことができます。

string s = "<Root><Parent id=\"1\"><Child>Thomas</Child></Parent><Parent id=\"2\"><Child>Tim</Child><Child>Jamie</Child></Parent></Root>"; 
XDocument xdoc = XDocument.Parse(s); 
foreach (XElement DirectChild in xdoc.Descendants().Where(child => child.Parent == xdoc.Root)) 
{ 
//Do stuff here 
} 

これが役に立ちます。ありがとうございました。

関連する問題