首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用XPATH对xmlnodelist进行排序,并将其转换回xmlnodelist

使用XPATH对xmlnodelist进行排序,并将其转换回xmlnodelist
EN

Stack Overflow用户
提问于 2009-10-24 10:41:56
回答 1查看 5.7K关注 0票数 1

我在C#中有一个xmlnodelist,我希望在不创建数组的情况下按ID排序。XML数据被加载到我创建的动态表中。我没有学习很多XPATH,但是我发现通过搜索附加的代码可以工作。但是,为了轻松地创建动态表,我希望将排序后的输出作为xmlnodelist返回。这个是可能的吗?

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

代码语言:javascript
复制
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;

        }
}
EN

回答 1

Stack Overflow用户

发布于 2009-10-25 17:57:10

但是,为了轻松地创建动态表,我希望将排序后的输出作为

返回给XmlNodeList

不能。为了拥有XmlNodeList,您需要XmlNodes,而XmlNode必须属于XmlDocument。而且您也没有创建一个XmlDocument

XPathDocument的全部要点之一是它不创建XmlNode对象。编写使用IXPathNavigable的代码的原因是,如果您必须浏览数万个节点才能找到其中的六个节点,那么您的代码不必首先创建数万个XmlNode对象。这就是为什么XPathNavigator代码比使用XmlDocument的代码快得多的主要原因。

如果要在代码中的任何地方使用IXPathNagivable,那么您应该在任何地方使用它。不要编写以XmlNodeXmlNodeList为参数的方法,而是编写以XPathNavigatorXPathNodeIterator为参数的方法。

例如,如果要从XML数据填充表,那么目前可能有如下所示的方法:

代码语言:javascript
复制
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);
}

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

代码语言:javascript
复制
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);
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1617633

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档