2017-03-01 86 views
-2

是否有任何方法來切斷xDocument的某些部分,仍然得到xDocument?通過切斷我的意思是保持選定的節點。
我有這樣的XML:
在c中縮小xdocument#

<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可能不會*看起來像這樣 - 我懷疑你實際上有XML屬性,而不是'Name ='形式的文本節點。我建議你將問題恢復到以前的版本,並且編輯我的答案以解決更一般的問題。 –

+0

如果只需要*一個嵌套元素,您的問題還不清楚。你只*試圖修剪頂層的元素,或修剪樹的各種位? –

+0

總的來說,我需要在名爲「我需要的唯一對象」的對象中使用lev2中的所有名稱。我嘗試了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的結構更復雜,我需要更多的通過屬性來縮小它的名稱=「我需要的唯一對象」 –

+0

@ArkadiuszRaszeja:那麼你應該把這個問題放在問題上,而不是說你只需要保留第一個元素。我回答了你問的問題,因爲這就是我必須要解決的問題。你應該可以修改我的答案 - 只需將'Skip'改爲'Where'子句,它可以選擇你不想保留的每個元素。 –

+0

正如我所說的,我的XML的結構非常複雜,所以沒有必要選擇要刪除的元素。選擇我想要保留的內容更容易。 –