获取带过滤子项的根元素

时间:2012-02-04 18:19:58

标签: c# .net xml xpath linq-to-xml

对于以下Xml:

<A>
  <B id=1>
    <C id=2 />
  </B>
  <B id=3>
    <C id=4 />
  </B>
</A>

我希望通过将C值设为4来获得此结果:

<A>
  <B id=3>
    <C id=4 />
  </B>
</A>

那么,什么是最好的解决方案?

3 个答案:

答案 0 :(得分:1)

假设您有一个代表XML结构的XDocument

var doc = XDocument.Parse(@"<A>
  <B id='1'>
    <C id='2' />
  </B>
  <B id='3'>
    <C id='4' />
  </B>
</A>");

XElement表示该文档中包含id='4'的元素

XElement x = doc.Descendants().Single(e => (int?)e.Attribute("id") == 4);

您可以构建一个由该元素及其父元素组成的新XDocument,如下所示:

XElement y = x;

while (x.Parent != null)
{
    x = x.Parent;
    y = new XElement(x.Name, x.Attributes(), y);
}

XDocument result = new XDocument(y);

结果:

<A>
  <B id="3">
    <C id="4" />
  </B>
</A>

答案 1 :(得分:1)

使用:

var doc = XDocument.Parse(@"<A>
<B id='1'>
<C id='2' />
</B>
<B id='3'>
<C id='4' />
</B>
</A>");

var elementsToRemove = doc.Root.Elements("B")
    .Where(b => (int)b.Element("C").Attribute("id") != 4);

elementsToRemove.Remove();

Console.WriteLine(doc);

输出:

<A>
  <B id="3">
    <C id="4" />
  </B>
</A>

答案 2 :(得分:0)

如果我理解,这就是你想要的:

//*[descendant::C[@id=4]]

即。所有以<c id="4"/>为孩子的元素。

顺便说一句,您的XML应该在数字周围引用格式良好。