Xpath帮助 - 选择一个节点并忽略兄弟姐妹

时间:2014-08-22 14:11:34

标签: c# xml xpath

我遇到查询xml并获取正确值的问题。 我有这个xml文件

<A id="a">
    <B id="b"></B>
    <C id="c1">
        <E id="e"></E>
        <F id="f1"></F>
        <F id="f2"></F>
        <F id="f3"></F>
        <G id="g"></G>
    </C>
    <C id="c2">
        <E id="e"></E>
        <F id="f1"></F>
        <F id="f2"></F>
        <F id="f3"></F>
        <G id="g"></G>
    </C>
    <C id="c3">
        <E id="e"></E>
        <F id="f1"></F>
        <F id="f2"></F>
        <F id="f3"></F>
        <G id="g"></G>
    </C>
    <D id="d"></D>
</A>

我想在C#中进行查询,选择f2的所有内容,但忽略F兄弟姐妹和C兄弟姐妹。 我希望得到这个结果

<A id="a">
    <B id="b"></B>
    <C id="c2">
        <E id="e"></E>
        <F id="f2"></F>
        <G id="g"></G>
    </C>
    <D id="d"></D>
</A>

对此的任何帮助都表示赞赏。

1 个答案:

答案 0 :(得分:0)

您将需要使用Linq-To-Xml:

XElement root = XElement.Load(file);

// Find the node you want to start the process on
XElement node = root.Descendants("F")
                    .FirstOrDefault(x => (string)x.Attribute("id") == "f2"
                                    && (string)x.Parent.Attribute("id") == "c2");

// Then iteratively remove similar named nodes recursively up the tree
XElement parent = node.Parent;
while (parent != null)
{
    var list = parent.Elements(node.Name)
         .Where(x => (string)x.Attribute("id") != (string)node.Attribute("id"))
         .ToList();
    list.ForEach(x => x.Remove());
    node = parent;
    parent = parent.Parent;
}

XElement result = root;

结果:

<A id="a">
  <B id="b"></B>
  <C id="c2">
    <E id="e"></E>
    <F id="f2"></F>
    <G id="g"></G>
  </C>
  <D id="d"></D>
</A>