Сортировка xmlnodelist с XPATH и преобразование обратно в xmlnodelist - PullRequest
1 голос
/ 24 октября 2009

У меня есть xmlnodelist в C #. Я бы хотел отсортировать по идентификатору без создания массивов. Данные XML загружаются в динамическую таблицу, которую я создал. Я мало изучал XPATH, но понял, что поиск в Google может сработать. Однако я хотел бы вернуть отсортированный вывод в виде 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 Ответ

1 голос
/ 25 октября 2009

Однако я хотел бы получить отсортированный вывод как XmlNodeList, чтобы легко создать динамическую таблицу

Ты не можешь. Чтобы иметь XmlNodeList, вам нужно XmlNode с, а XmlNode должно принадлежать XmlDocument. И вы не создаете XmlDocument.

Сортировка всей точки XPathDocument, что он не создает XmlNode объектов. Причиной написания кода, использующего IXPathNavigable, является то, что если вам нужно перемещаться по десяткам тысяч узлов, чтобы найти шесть из них, ваш код не должен сначала создавать десятки тысяч XmlNode объектов. Это основная причина, почему код XPathNavigator намного быстрее, чем код, который использует XmlDocument.

Если вы собираетесь использовать IXPathNagivable в любом месте вашего кода, вы должны использовать его везде. Не пишите методы, которые принимают XmlNode и XmlNodeList в качестве параметров; написать методы, которые принимают XPathNavigator и XPathNodeIterator вместо.

Например, если вы заполняете таблицу из данных 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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...