【问题标题】:Sorting xmlnodelist with XPATH, and convert back to xmlnodelist使用 XPATH 对 xmlnodelist 进行排序,并转换回 xmlnodelist
【发布时间】:2009-10-24 10:41:56
【问题描述】:

我在 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;

        }
}

【问题讨论】:

    标签: c# xml xpath


    【解决方案1】:

    但是,我想将排序后的输出返回为 XmlNodeList,以便轻松创建动态表

    你不能。为了拥有XmlNodeList,您需要XmlNodes,并且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);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-05-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-27
      • 1970-01-01
      • 1970-01-01
      • 2016-03-05
      相关资源
      最近更新 更多