我在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;
}
}发布于 2009-10-25 17:57:10
但是,为了轻松地创建动态表,我希望将排序后的输出作为
返回给
XmlNodeList。
不能。为了拥有XmlNodeList,您需要XmlNodes,而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);
}https://stackoverflow.com/questions/1617633
复制相似问题