2010-07-15 48 views
1

我需要一些幫助從XPathNodeIterator返回一個XmlDocument對象。從XPathNodeIterator返回一個XmlDocument

這是我要怎樣做:

public XmlDocument GetFilteredXML(XmlDocument baseXML, int codeID) 
{ 
    XPathNavigator nav = baseXML.CreateNavigator(); 
    string xpath = /*some expression based on codeID*/; 
    XPathExpression exp = nav.Compile(xpath); 
    exp.AddSort(/*do some sorting*/); 
    XPathNodeIterator iter = exp.Select(exp); 

    // Here how do I return an XmlDocument object from 
    // the iterator which contains the selected nodes only? 
} 

回答

2

XPathNodeIterator包含節點,正好。該名稱是一個線索 - 它是一個迭代器,這意味着它只包含如何遍歷所需節點的邏輯。節點本身來自其他地方 - 在這種情況下,您提供了原始的baseXML對象。他們永遠不會離開那個對象,你只是創建了一個知道如何導航文檔的導航器,以及一個迭代器,它知道如何使用一些標準迭代導航器。

要做到你所描述的東西,你需要創建一個新的XmlDocument,給它一個新的根元素,並從迭代器的每個節點,請撥打ImportNode然後Append。這將創建一個包含根元素中所有選定節點的平面XmlDocument。

0

這是一個選項:

if (iter.MoveNext()) // Position on first node selected, 
{      // assuming that it is the container for the desired result. 
    XmlDocument output = new XmlDocument(); 
    output.LoadXml(iter.Current.OuterXml); 
    return output; 
} 

不過,我不認爲你需要將它做成的XPathNavigator擺在首位。你在做什麼操作,用XmlDocument方法無法完成?(SelectNodes和SelectSingleNode彈出,以便評估XPath表達式)

+0

我使用XPathExpression添加了一些排序條件。 – Daniel 2010-07-15 17:30:48

+0

OuterXml屬性按原樣返回整個xml(未過濾) – Daniel 2010-07-15 17:40:08