2

我有这样的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()

但它不起作用。

4

1 回答 1

4

它甚至不会编译(基于您发布的代码)。您正朝着正确的方向前进,但您的查询有点偏离。

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>

上述代码在 VS 2012 的控制台应用程序中进行了测试。

于 2013-06-01T03:13:01.710 回答