2017-06-30 25 views
1

こんにちは、私はxmlファイルを使っていろいろ試していました。xmlにルートノードへの名前空間があるとき

<root> 
    <Child1> 
</root> 

だから、「CHILD1」は変更することができることを考えると、「CHILD2」または「Child3:

は、私は、ルートノードから始まり、その後、例えば名前を変更することができ、他の子ノードを持つXMLを持っています"私はこのlinqが私の方法で来るものから名前を抽出できるようにしました。

最初:私は名前空間なしで私のxmlを持っているとき

XElement root = XElement.Parse(xml); 

var childType = root.Descendants().First(x => x.Name == "Child1" || x.Name == "Child2"|| x.Name == "Child3").Name; 

だから、上記のように、それは罰金workes、私は、ノードのタグから名前を抽出するために管理します。

しかし、私はそれがエラーをスロールートタグに名前空間を持っている場合:

<root xmlns="namespace"> 
    <Child1> 
</root> 

XMLは同じLINQを通過することを、スロー:

Sequence contains no matching element

答えて

2

をごroot要素が定義された名前空間を持っています(xmlns="namespace")、すべての子要素は同じ名前空間に関連付けられます。私。 Child1要素は同じ名前空間にあり、名前には名前空間接頭辞とローカル名("Child1")の両方が含まれます。

var ns = root.GetDefaultNamespace(); 
var childType = root.Descendants() 
    .First(x => x.Name == ns +"Child1" || x.Name == ns + "Child2"|| x.Name == ns + "Child3") 
    .Name; 

をそれとも、x.Name.LocalNameを探すことができます(ただし、それはあなたが別の名前空間からChild1の要素を持つことになりそうだけれども、私は、このアプローチをrecommnedません):だからChild1要素を検索するときは、完全な名前を指定することができます。

注:お使いのChild要素は終了タグを持っていない(おそらくそれはだ誤植)

深い読み:それは、これはのxmlns `と不履行名前空間に起因することを説明し、おそらく価値がXml Namespaces

+1

= ...' 。私はそれをやろうとしていましたが、あなたの答えのほとんどが*重複していると考えました... –

+1

これは完全に機能し、私が探していた答えでした。ありがとうございました。 – John