2013-06-01 49 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