Однако я хотел бы получить отсортированный вывод как 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);
}