XDocument のクエリと XElement のクエリ (C#)Querying an XDocument vs. Querying an XElement (C#)

XDocument.Load によってドキュメントを読み込む場合、XElement.Load によって読み込む場合とは少し異なるクエリを記述する必要があることがわかります。When you load a document via XDocument.Load, you will notice that you have to write queries slightly differently than when you load via XElement.Load.

XDocument.Load と XElement.Load の比較Comparison of XDocument.Load and XElement.Load

XElement によって XML ドキュメントを XElement.Load に読み込む場合、XML ツリーのルートの XElement には読み込んだドキュメントのルート要素が含まれます。When you load an XML document into an XElement via XElement.Load, the XElement at the root of the XML tree contains the root element of the loaded document. 一方、XDocument によって同じ XML ドキュメントを XDocument.Load に読み込む場合は、ツリーのルートは XDocument ノードで、読み込んだドキュメントのルート要素は XElement の許可されている 1 つの子 XDocument ノードになります。However, when you load the same XML document into an XDocument via XDocument.Load, the root of the tree is an XDocument node, and the root element of the loaded document is the one allowed child XElement node of the XDocument. LINQ to XMLLINQ to XML 軸は、ルート ノードを基準に動作します。The LINQ to XMLLINQ to XML axes operate relative to the root node.

この最初の例では、Load を使用して XML ツリー読み込みます。This first example loads an XML tree using Load. 次に、ツリーのルートの子要素をクエリします。It then queries for the child elements of the root of the tree.

// Create a simple document and write it to a file  
File.WriteAllText("Test.xml", @"<Root>  
    <Child1>1</Child1>  
    <Child2>2</Child2>  
    <Child3>3</Child3>  
</Root>");  
  
Console.WriteLine("Querying tree loaded with XElement.Load");  
Console.WriteLine("----");  
XElement doc = XElement.Load("Test.xml");  
IEnumerable<XElement> childList =  
    from el in doc.Elements()  
    select el;  
foreach (XElement e in childList)  
    Console.WriteLine(e);  

この例では、次の出力が生成されることが想定されます。As expected, this example produces the following output:

Querying tree loaded with XElement.Load  
----  
<Child1>1</Child1>  
<Child2>2</Child2>  
<Child3>3</Child3>  

次の例は上の例と同じですが、XDocument ではなく XElement に XML ツリーが読み込まれる点が異なります。The following example is the same as the one above, with the exception that the XML tree is loaded into an XDocument instead of an XElement.

// Create a simple document and write it to a file  
File.WriteAllText("Test.xml", @"<Root>  
    <Child1>1</Child1>  
    <Child2>2</Child2>  
    <Child3>3</Child3>  
</Root>");  
  
Console.WriteLine("Querying tree loaded with XDocument.Load");  
Console.WriteLine("----");  
XDocument doc = XDocument.Load("Test.xml");  
IEnumerable<XElement> childList =  
    from el in doc.Elements()  
    select el;  
foreach (XElement e in childList)  
    Console.WriteLine(e);  

この例を実行すると、次の出力が生成されます。This example produces the following output:

Querying tree loaded with XDocument.Load  
----  
<Root>  
  <Child1>1</Child1>  
  <Child2>2</Child2>  
  <Child3>3</Child3>  
</Root>  

この同じクエリでは、3 つの子ノードではなく 1 つの Root ノードが返されたことがわかります。Notice that the same query returned the one Root node instead of the three child nodes.

これに対処する 1 つの方法は、次のように、軸メソッドにアクセスする前に Root プロパティを使用することです。One approach to dealing with this is to use the Root property before accessing the axes methods, as follows:

// Create a simple document and write it to a file  
File.WriteAllText("Test.xml", @"<Root>  
    <Child1>1</Child1>  
    <Child2>2</Child2>  
    <Child3>3</Child3>  
</Root>");  
  
Console.WriteLine("Querying tree loaded with XDocument.Load");  
Console.WriteLine("----");  
XDocument doc = XDocument.Load("Test.xml");  
IEnumerable<XElement> childList =  
    from el in doc.Root.Elements()  
    select el;  
foreach (XElement e in childList)  
    Console.WriteLine(e);  

このクエリは、XElement をルートとするツリーのクエリと同じように動作します。This query now performs in the same way as the query on the tree rooted in XElement. この例では次の出力が生成されます。The example produces the following output:

Querying tree loaded with XDocument.Load  
----  
<Child1>1</Child1>  
<Child2>2</Child2>  
<Child3>3</Child3>  

関連項目See also