在XmlDocument中对节点进行排序的最佳方法是什么? (。净)

时间:2008-10-31 14:12:02

标签: .net sorting xmldocument

我使用的是XSL样式表来进行排序,但似乎非常慢。有更有效的方法吗?

它是一个平面的节点列表,如果我将节点转换为一个对象并在GenericList中排序会有帮助吗?

编辑我不需要最终结果是XML。

3 个答案:

答案 0 :(得分:1)

根据我的经验,XSL是最好的方法之一,但是,当您使用大型输入文件时,整体速度有点粗略。

你可以自己动手,但说实话,我不认为它会更快。

我能想到的唯一其他可能的选择是加载到数据视图中,或者在那里对其进行排序,然后返回到XML,但这似乎是一种错误的方法。

编辑 - 根据您添加的信息,是的,我很确定加载到列表中的速度会快得多......您需要尝试进行双重检查,但是如果你还需要其他格式,你也可以。

答案 1 :(得分:1)

首先检查您是否使用低效的节点选择方式(例如// node)可能是值得的。

答案 2 :(得分:1)

使用XslCompiledTransform使用xsl执行此操作,但请确保缓存XslCompiledTransform,因为编译速度很慢,执行速度非常快。

所以:

  1. 编写一个与您的xml匹配的xsl,对它们进行排序并将排序后的列表作为输出
  2. 获取XslCompiledTransform从缓存中保存xsl,如果它不存在,则创建它并插入缓存
  3. 将xml通过xsl转换为新的XmlDocument
  4. 这很快,保持代码清洁,在更改排序实现方面你很灵活;它只是编辑一个xsl。

    我在没有检查的情况下输入此内容,因此可能存在拼写错误,但这就是您应该采取的措施:

    XslCompiledTransform xsl = (XslCompiledTransform)HttpRuntime.Cache.Get("my_xsl");
    if (xsl == null)
    {
      string fileName = "path/to/your/xslfile.xsl";
      xsl = new XslCompiledTransform();
      xsl.Load(fileName);  
      HttpRuntime.Cache.Insert("my_xsl", xsl, new CacheDependency(new string[]{fileName}));
    }
    

    转换使用这样的方法:

    public static XmlNode TransformToXml(IXPathNavigable xml, XslCompiledTransform xsl, XsltArgumentList arguments, XmlWriterSettings settings)
    {
      XmlDocument output = new XmlDocument();
      using (XmlWriter writer = XmlWriter.Create(output.CreateNavigator().AppendChild()))
      {
        xsl.Transform(xml, arguments, writer);
      }
      return output;
    }