使用XPATH对xmlnodelist进行排序,然后转换回xmlnodelist

时间:2009-10-24 10:41:57

标签: c# xml xpath

我在C#中有一个xmlnodelist我希望按ID排序而不创建数组。 XML数据被加载到我创建的动态表中。 我没有研究过很多XPATH但我通过谷歌搜索附件代码可以解决。 但是,我想将排序后的输出作为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 个答案:

答案 0 :(得分:1)

  

但是,我希望将排序后的输出恢复为XmlNodeList,以便轻松创建动态表

你做不到。要获得XmlNodeList,您需要XmlNode个,而XmlNode必须属于XmlDocument。而且你没有创建XmlDocument

它不会创建XPathDocument个对象的XmlNode的整个点的排序。编写使用IXPathNavigable的代码的原因是,如果您必须浏览数万个节点以找到其中的六个节点,那么您的代码不必首先创建数万个XmlNode个对象。这是XPathNavigator代码比使用XmlDocument的代码快得多的主要原因。

如果您要在代码中的任何位置使用IXPathNagivable,则应该在任何地方使用它。不要编写以XmlNodeXmlNodeList为参数的方法;编写代替XPathNavigatorXPathNodeIterator的方法。

例如,如果您从XML数据填充表格,那么您现在可能拥有如下所示的方法:

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

你可以这样轻松地编写代码:

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