2011-08-29 5 views
14

私は単純なXMLを持っています。XElement.Descendantsが名前空間で動作しない

<S xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"><H></H></S> 

すべての "H"ノードを探したいです。

XElement x = XElement.Parse("<S xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"><H></H></S>"); 
IEnumerable<XElement> h = x.Descendants("H"); 
if (h != null) 
{ 
} 

しかし、このコードは動作しません。 Sタグから名前空間を削除すると、コードが正しく動作します。

+0

この質問は、WPFとは何の関係もありません。ちなみに... –

+0

ありがとうございました。「WPF」タグを削除しました。 –

答えて

42

xmlnsは、その要素とその子孫のデフォルトのという名前空間を効果的に設定するため、要素に名前空間があります。代わりにこれを試してみてください:

XNamespace ns = "http://schemas.microsoft.com/winfx/2006/xaml/presentation"; 
IEnumerable<XElement> h = x.Descendants(ns + "H"); 

注意をDescendants決してリターンヌルがするので、あなたのコードの末尾の状態が無意味であること。

あなたは関係なく、名前空間のすべてHの要素を検索したい場合は、あなたが使用できます。

var h = x.Descendants().Where(e => e.Name.LocalName == "H"); 
+0

ありがとうございました。 –

6

はちょうどあなたがこのような名前空間を取得することができますJonの答えに追加したい:

XNamespace ns = x.Name.Namespace 

それで彼は提案したように使います:

IEnumerable<XElement> h = x.Descendants(ns + "H"); 
関連する問題