2009-10-24 88 views
1

我在C#中的XmlNodeList我想排序ID,而無需創建陣列。 將XML數據加載到我創建的動態表中。 我還沒有研究過很多XPATH,但我通過谷歌搜索找到了附加的代碼可以工作。 Howevern,我想獲得排序輸出反饋作爲XmlNodeList中,以輕鬆創建動態表。 這可能嗎?排序與XPATH XmlNodeList中,並將其轉換回的XmlNodeList

http://forums.asp.net/t/1226980.aspx):

public partial class DefaultSamePage : System.Web.UI.Page 
{ 
//a public var XmlNodeList, in order to use it both in sortNodeList and another function 
    XmlNodeList sortedNodes; 
} 

    void sortNodeList() 
{ 
     XPathDocument myQuiz = new XPathDocument(Server.MapPath("quiz.xml")); 
     XPathNavigator nav = myQuiz.CreateNavigator(); 
     XPathExpression myExp = nav.Compile("//question"); 
     myExp.AddSort("@id", XmlSortOrder.Descending, XmlCaseOrder.None, "", XmlDataType.Number); 
     XPathNodeIterator iter = nav.Select(myExp); 
     while (iter.MoveNext()) 
     { 
      // is this possible? 
      sortedNodes = iter.Current.Value; 

     } 
} 

回答

1

不過,我想獲得的有序輸出背爲XmlNodeList,以創建動態表容易

你不能。爲了有一個XmlNodeList,你需要XmlNode S,和XmlNode必須屬於一個XmlDocument。而你並沒有創建一個XmlDocument

XPathDocument整點的排序,它不會創建XmlNode對象。編寫代碼,使用IXPathNavigable的原因是,如果你有通過節點數以萬計的導航找到他們六人,你的代碼沒有首先創建XmlNode對象數以萬計。這是最主要的原因,XPathNavigator代碼比使用XmlDocument代碼快得多。

如果你想在你的代碼中使用IXPathNagivable的任何地方,你應該到處使用它。不要編寫採用XmlNodeXmlNodeList作爲參數的方法;代替XPathNavigatorXPathNodeIterator的寫入方法。

舉例來說,如果你從XML數據填充表的,你可能有目前看起來像的方法:

public void PopulateTable(DataTable t, XPathNodeIterator iter) 
{ 
    foreach (XPathNavigator n in iter) 
    { 
     CreateRow(t, n); 
    } 
} 

private void CreateRow(DataTable t, XPathNavigator n) 
{ 
    DataRow r = t.NewRow(); 
    t["foo"] = n.GetAttribute("foo", ""); 
    t["bar"] = n.GetAttribute("bar", ""); 
    t.Rows.Add(r); 
} 

public DataTable PopulateTable(DataTable t, XmlNodeList nodes) 
{ 
    foreach (XmlNode n in nodes) 
    { 
     CreateRow(t, n); 
    } 
} 

private void CreateRow(DataTable t, XmlNode n) 
{ 
    DataRow r = t.NewRow(); 
    t["foo"] = n.GetAttribute("foo"); 
    t["bar"] = n.GetAttribute("bar"); 
    t.Rows.Add(r); 
} 

你可以很容易地通過這種方式編寫代碼