我在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;
}
}
答案 0 :(得分:1)
但是,我希望将排序后的输出恢复为
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);
}