1

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

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

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

4

3 回答 3

1

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

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

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

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

于 2008-10-31T14:15:44.583 回答
1

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

于 2008-10-31T14:21:27.023 回答
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;
}
于 2008-10-31T15:43:55.157 回答