2017-03-01 2 views
-2

xDocumentの一部を切り捨ててxDocumentを取得する方法はありますか?切断すると、選択されたノードを保持することを意味します。
私はこのようなXMLがあります。
狭いxdocumentをC#

<something 1> 
    <object> 
     Name="The only object I need" 
     <lev1> 
      <lev2> 
       Name= "Attribute I need" 
      </lev2> 
      <lev2> 
       Name= "Attribute I also need" 
      </lev2> 
     </lev1> 
    </object> 
    <object> 
     Name="Thing I want to remove" 
     <lev1> 
      <lev2> 
       Name= "useless attribute" 
      </lev2> 
      <lev2> 
       Name= "second useless atribute" 
      </lev2> 
     </lev1> 
    </object> 
</something 1> 

を私は名前=「私は必要と属性」を持つ唯一のオブジェクトを含むxDocumentオブジェクトが必要です。私はそれが簡単だと知っていますが、私はそれを見つけることができません。
編集:
私は非常に巨大なXMLファイルについてたくさん話しています。したがって、私は削除するものだけを選択することはできません。

+1

そして、私の答えが無効に見えるように質問を変更しました。しないでください。次に、あなたのXMLはおそらく* *そうではありません - 私は実際には 'Name ="という形式のテキストノードではなくXML属性を持っていると思われます。あなたの質問を以前のバージョンに戻すことをお勧めします。より一般的な側面に対処するために私の答えを編集します。 –

+0

ネストされた要素のうちの* 1つだけが必要な場合に何が起こるかという点についても、あなたの質問はかなり不明です。トップレベルから要素を取り除こうとするか、ツリーのすべての種類のビットを整理しようとしていますか? –

+0

私はlev2内のすべての名前をname = "オブジェクトが必要なオブジェクト"内に必要としています。私はxdoc.Elements()を試してみました。(x => x.Attribute(xmlns + "Name")Value.ToString()== "必要なオブジェクトは唯一")FirstOrDefault();しかし、私は "x変数が呼び出されるように設定されていない"のようなエラーをドイツ語から翻訳しています... –

答えて

2

最初の子ノードだけが必要なのですか?はい、それはRemove拡張メソッドを使用して簡単です:

doc.Root.Elements().Skip(1).Remove(); 

サンプル:

using System; 
using System.Linq; 
using System.Xml.Linq; 

class Test 
{ 
    static void Main() 
    { 
     var doc = new XDocument(new XElement ("root", 
      new XElement("child1", new XElement("grandchild1")), 
      new XElement("child2", new XElement("grandchild2")))); 

     Console.WriteLine("Document before:"); 
     Console.WriteLine(doc); 

     doc.Root.Elements().Skip(1).Remove(); 

     Console.WriteLine("Document after:"); 
     Console.WriteLine(doc); 
    } 
} 

出力:

Document before: 
<root> 
    <child1> 
    <grandchild1 /> 
    </child1> 
    <child2> 
    <grandchild2 /> 
    </child2> 
</root> 
Document after: 
<root> 
    <child1> 
    <grandchild1 /> 
    </child1> 
</root> 

これを一般化するには、あなただけにSkipコールを変更したいと思います保存しない要素を選択します。

doc.Root 
    .Elements() 
    .Where(x => (string) x.Attribute("name") != "name to keep") 
    .Remove(); 
+0

新しい知識をありがとう、私はそれを知らなかった。しかし、私のXMLの構造ははるかに複雑で、属性で絞り込むためにはもっと必要です。Name = "私が必要なオブジェクト" –

+0

@ArkadiuszRaszeja:それでは、最初の要素。あなたが尋ねた質問に答えました。それは私が取り組まなければならなかったものですから。あなたは私の答えに適応することができるはずです - ちょうど 'Skip'を' Where'節に変更して、保持したくない各要素を選択してください。 –

+0

私が言ったように、私のXMLの構造は非常に複雑なので、削除する要素を選択する必要はありません。それは、私が保持したいものだけを選択する方が簡単です。 –