2008-12-19 45 views
0

我正在使用XPathExpression選擇解析存在於各種深度級別的某些節點的大XML文件。如何將XPathExpression結果保存爲用祖先結構分隔XML?

導出選定節點以分離XML文件,保留所有直接祖先節點(及其屬性)的最簡單方法是什麼? C#是首選。

示例源XML:

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

預期目標XML用於過濾反對票 「c」 的節點

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

編輯:我使用XPathExpression和創建XPathNodeIterator因爲存在用於測試附加邏輯如果給定的節點應該包含在結果XML中,僅XPathExpression是不夠的。所以基本上我有一組匹配的XPathNavigator元素,我想用祖先結構保存到XML中。

回答

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"); 
+0

我正在使用XPathExpression和XPathNodeIterator,因爲如果給定節點應該包含在結果XML中,則只有XPathExpression是不夠的。所以基本上我有一組匹配的XPathNavigator元素,我想用祖先結構保存到XML中。 – tomash 2008-12-19 13:29:05

0

我已經使用基於溶液的馬克的上面,具有小的修改上:我不使用「後代或自身」開關,但對選擇(和驗證)節點我使用以下遍歷:

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)); 
    }