2012-04-24 14 views
4

linq-to-xmlを使用して要素を検索しています。Linq-to-XMLは名前空間を持つ要素を取得します

var doc = XDocument.Load(reader); 
        var ns = doc.Root.Attribute("xmlns").Value; 
        var result = (from u in doc.Descendants(XName.Get("MyElement", ns)) 

xmlで要素を見つけようとするたびに、XName.Getを使用しなくする必要があります。私はどのようにXDocumentにデフォルトネームスペースを設定して、検索時に気にしないようにすることができます。

よろしくお願いいたします。

答えて

5

あなたが本当にそれをしたい場合は、デフォルトの名前空間を無視する一つの方法は、次のとおりです。

 XDocument doc; 
     using (XmlTextReader xr = new XmlTextReader("input.xml")) 
     { 
      xr.Namespaces = false; 
      doc = XDocument.Load(xr); 
     } 
     foreach (XElement bar in doc.Descendants("bar")) 

しかし、私はXMLでの名前空間の存在と重要性を受け入れ、たXNameを使用することをお勧めしてXNamespaceは、LINQオブジェクトXMLとの連携を提供します。

+0

はい私は名前空間の重要性に同意しますが、私の場合、私のXML文書要素は私が既に知っている単一の名前空間に属しています。だから私は本当に何度も何度もそれを渡す必要はありません。 –

1

あなたが行うことはできません。

doc = XDocument.Load(reader); 
var ns = doc.Root.Attribute("xmlns").Value; 
var result = from u in doc.Descendants.Elements(ns+"MyElement").Select(c=>c.Value); 
+0

これもまた、nsを連結してコードを少し不明瞭にする必要があります。私たちはnsを避けることはできませんか? –

4

私は、XMLの要素を見つけることを試みるたびXName.Getを使用して取り除く必要があります。私はどのようにXDocumentにデフォルトネームスペースを設定して、検索時に気にしないようにすることができます。

はあなたがすることはできません - しかし、他の二つのオプションがあります:

  • 使用+(XNamespace, string)オペレータ:

    doc.Descendants(ns + "MyElement") 
    
  • はちょうどその時にそれらを参照してください、一度XName値を作成するにはあなたの質問、例えば

    XName myElementName = ns + "MyElement"; 
    ... 
    doc.Descendants(myElementName); 
    

理想的には、とにかく動的に名前空間を作成しません - あなたはあなたが探している必要があり名前空間を知ってないのですか?そうした場合は、適切なXNameの値を持つプライベート静的読み取り専用フィールドを作成できます。ここで

+0

このノードのすべての要素がこの名前空間に属しているとは言えません。 –

+0

@Shoaib Shaikh:文字列ではなく 'XName'で検索するだけです。 stringから変換して 'XName'を作成すると、名前空間を持たない' XName'が作成されます。 –

+0

XDocumentとして扱う前に、xmlのテキストから名前空間を削除することができます。 –

1

LocalNameを使用することもできますが、これはLINQを醜くしますが、ジョブは完了します。 (この場合、MSBuildプロジェクトファイルから属性を取得します)。

var imports = from i in doc.Root.Elements() 
       where i.Name.LocalName == "Import" 
       from p in i.Attributes() 
       where p.Name.LocalName == "Project" 
       select p.Value; 

私はこの方法でそれをやって好きなことは、それが元の形でXMLを残していることで、まだそれは面白いことが起こっている他の人に示唆しています。 LINQ式に 'LocalName'を入れることは、自己文書化ハックの一種です。

コードが分離されると、XmlTextReaderで名前空間を無効にすることは簡単に見落とされます。

関連する問題