【问题标题】:What is the best way to sort nodes in an XmlDocument? (.Net)对 XmlDocument 中的节点进行排序的最佳方法是什么? (。网)
【发布时间】:2010-09-20 04:46:32
【问题描述】:

我使用 XSL 样式表进行排序,但它似乎很慢。有没有更有效的方法?

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

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

【问题讨论】:

    标签: .net sorting xmldocument


    【解决方案1】:

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

    所以:

    1. 编写一个与您的 xml 匹配的 xsl,对它们进行排序并将排序后的列表作为输出
    2. 从缓存中获取持有该 xsl 的 XslCompiledTransform,如果它不存在,则创建它并插入到缓存中
    3. 通过 xsl 将 xml 转换为新的 XmlDocument

    这非常快,可以保持代码干净,并且在更改排序实现时可以灵活;它只是在编辑一个 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;
    }
    

    【讨论】:

      【解决方案2】:

      首先检查一下您没有使用低效的节点选择方式,例如 //node.

      【讨论】:

        【解决方案3】:

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

        你可以推出自己的排序,但老实说,我不认为它会更快。

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

        编辑 - 根据您添加的信息,是的,我很确定加载到列表中会更快......您需要尝试仔细检查,但是如果你仍然需要其他格式,你也可以。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-07-07
          • 1970-01-01
          • 2010-12-16
          • 2021-06-09
          • 1970-01-01
          • 1970-01-01
          • 2010-09-18
          • 2011-11-22
          相关资源
          最近更新 更多