C# 如何将XPathExpression结果保存为使用祖先结构分离XML?

C# 如何将XPathExpression结果保存为使用祖先结构分离XML?,c#,linq,xpath,linq-to-xml,C#,Linq,Xpath,Linq To Xml,我正在使用XPathExpression选择解析一些存在于不同深度级别的节点的大XML文件 将选定的节点导出到单独的XML文件,保留所有直接祖先节点(及其属性)的最简单方法是什么?C#优先 示例源XML: <a> <x> <b> <c/> <z/> </b> <c/> </a> <c/> <d><e/></d> 过滤

我正在使用XPathExpression选择解析一些存在于不同深度级别的节点的大XML文件

将选定的节点导出到单独的XML文件,保留所有直接祖先节点(及其属性)的最简单方法是什么?C#优先

示例源XML:

<a>
  <x>
  <b>
    <c/>
    <z/>
  </b>
  <c/>
</a>
<c/>
<d><e/></d>

过滤againts“c”节点所需的目标XML



编辑:我使用XPathExpression和XPathNodeIterator是因为有额外的逻辑来测试给定的节点是否应该包含在结果XML中,仅仅使用XPathExpression是不够的。所以基本上我有一个匹配的XPathNavigator元素数组,我想用祖先结构将其保存为XML。

stringXML=@”
string xml = @"<xml>
 <a>
  <x/>
  <b>
    <c/>
    <z/>
  </b>
  <c/>
</a>
<c/>
<d><e/></d></xml>";
    XmlDocument doc = new XmlDocument();
    doc.LoadXml(xml);
    XmlDocument results = new XmlDocument();
    XmlNode root = results.AppendChild(results.CreateElement("xml"));
    foreach (XmlNode node in doc.SelectNodes("/*/*[descendant-or-self::c]"))
    {
        root.AppendChild(results.ImportNode(node, true));
    }
    results.Save("out.xml");
"; XmlDocument doc=新的XmlDocument(); doc.LoadXml(xml); XmlDocument结果=新的XmlDocument(); xmlnoderoot=results.AppendChild(results.CreateElement(“xml”); foreach(doc.SelectNodes中的XmlNode节点(“/*/*[后代或自身::c]”) { AppendChild(results.ImportNode(node,true)); } results.Save(“out.xml”);
我使用了基于上述Marc的解决方案,只是做了一些小的修改:我没有使用“后代或自我”开关,但对于选定(和验证)的节点,我使用了以下遍历:

    private void appendToOut(XmlNode node, XmlNode parameter)
    {
        if (node.ParentNode != null && node.ParentNode.NodeType != XmlNodeType.Document)
        {
            appendToOut(node.ParentNode, node);
        }
        diffRoot.AppendChild(diffDoc.ImportNode(node, node==parameter));
    }

我使用XPathExpression和XPathNodeIterator是因为有额外的逻辑来测试给定的节点是否应该包含在结果XML中,仅使用XPathExpression是不够的。所以基本上我有一个匹配的XPathNavigator元素数组,我想用祖先结构将其保存到XML中。@tomash-可能表明(大致)您当前是如何使用它的?如果我们枚举“c”元素,则有一个单独的(完全外部的)业务函数,它会计算给定的“c”XmlNode(或“c”XPathNavigator)是否有效。如果上面的第一个“C”是无效的,“B”也不应该添加,但是它包含在“子代或自”开关中……在这种情况下,您可以考虑XSLT使用自定义的外部对象(通过XSLTGARMUMENTROLT)——而不是琐碎的,但是
    private void appendToOut(XmlNode node, XmlNode parameter)
    {
        if (node.ParentNode != null && node.ParentNode.NodeType != XmlNodeType.Document)
        {
            appendToOut(node.ParentNode, node);
        }
        diffRoot.AppendChild(diffDoc.ImportNode(node, node==parameter));
    }