2013-06-01 45 views
2

特定屬性我有xml文件是這樣的:刪除節點不包括那些具有使用LINQ到XML

<group> 
    <First_group> 
    </First_group> 
    <Second_group> 
    <Name number="1"> 
    </Name> 
    <Name number="2"> 
    </Name> 
    <Name number="3"> 
    </Name> 
    </Second_group> 
    <Third_group> 
    </Third_group> 
</group> 

我想刪除節點名稱不包括一個具有屬性= 1

這裏是代碼:

Dim doc As XDocument = XDocument.Load("c:\temp\node.xml") 
doc.Root.Element("Second_group").Elements("Name").Attributes("number").Value > 1.Remove() 

但它沒有工作。

+0

你們是不是要刪除的節點底層文件,或只是在XDocument對象? – joelt

+0

它會給你一個錯誤?我不確定LINQ會執行。 – Tim

+0

我收到此錯誤錯誤:'值'不是'System.Collections.Generic.IEnumerable(Of System.Xml.Linq.XAttribute)'的成員。 – Chelovek

回答

3

它甚至不會編譯(根據您的發佈代碼)。你正朝着正確的方向前進,但是你的查詢有點偏離。

Attributes("number").Value 

不能編譯,因爲Value不是Attributes成員 - Attributes返回匹配名稱屬性的收集,你可以不是一個集合比較單一值(至少不是很容易)。

您真正需要的是Where子句,它將Where子句的表達式作爲謂詞進行評估。就像這樣:

Doc.Root.Element("Second_group"). 
Elements("Name"). 
Where(Function(x) CInt(x.Attribute("number"). 
Value) > 1). 
Remove() 

注意上面的代碼分佈在多個線路破壞,使得人們可以看到整個查詢,而無需水平滾動。對於VB.Net它應該是在一個單一的線,例如:

Doc.Root.Element("Second_group").Elements("Name").Where(Function(x) CInt(x.Attribute("number").Value) > 1).Remove() 

在上述例子中,WHERE子句需要,檢查對於所有的選擇的名稱的元素的數量屬性的謂詞。 Value返回一個字符串,所以我用CInt將它轉換爲數字。然後,刪除「Second_group」中具有大於1的「number」屬性的任何「Name」元素。

所以你的XML,上面的語句後,看起來就像這樣:

<group> 
    <First_group> 
    </First_group> 
    <Second_group> 
    <Name number="1"> 
    </Name> 
    </Second_group> 
    <Third_group> 
    </Third_group> 
</group> 

上面的代碼是在一個控制檯應用程序測試了2012年VS

+0

嗯......我收到錯誤「Leading」。要麼 '!'只能出現在'With'語句中。「你知道可能會導致這種情況嗎? – Chelovek

+0

嘗試將查詢全部放在一行上(我把它分開,以便人們可以閱讀而不必滾動橫向)。像這樣:'Doc.Root.Element(「Second_group」)。Elements(「Name」)。Where(Function(x)CInt(x.Attribute(「number」)。Value)> 1).Remove()' – Tim

+0

@Chelovek - 我添加了整個行結合到我的答案。另外我注意到,我在代碼中存在拼寫錯誤(屬性而不是屬性),現在也已修復此錯誤。 – Tim