0

我正在为存在于不同深度级别的某些节点解析带有 XPathExpression 选择的大型 XML 文件。

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

示例源 XML:

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

用于过滤“c”节点的预期目标 XML

<a>
  <b>
    <c/>
  </b>
  <c/>
</a>
<c/>

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

4

2 回答 2

2
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");
于 2008-12-19T13:20:59.253 回答
0

我使用了基于上述 Marc 的解决方案,并进行了少量修改:我没有使用“descendant-or-self”开关,但对于选定(和验证)的节点,我正在使用以下遍历:

    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));
    }
于 2008-12-19T14:14:24.340 回答