C# 如何将XPathExpression结果保存为使用祖先结构分离XML?
我正在使用XPathExpression选择解析一些存在于不同深度级别的节点的大XML文件 将选定的节点导出到单独的XML文件,保留所有直接祖先节点(及其属性)的最简单方法是什么?C#优先 示例源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> 过滤
<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));
}