我使用的是XSL样式表来进行排序,但似乎非常慢。有更有效的方法吗?
它是一个平面的节点列表,如果我将节点转换为一个对象并在GenericList中排序会有帮助吗?
编辑我不需要最终结果是XML。
答案 0 :(得分:1)
根据我的经验,XSL是最好的方法之一,但是,当您使用大型输入文件时,整体速度有点粗略。
你可以自己动手,但说实话,我不认为它会更快。
我能想到的唯一其他可能的选择是加载到数据视图中,或者在那里对其进行排序,然后返回到XML,但这似乎是一种错误的方法。
编辑 - 根据您添加的信息,是的,我很确定加载到列表中的速度会快得多......您需要尝试进行双重检查,但是如果你还需要其他格式,你也可以。
答案 1 :(得分:1)
首先检查您是否使用低效的节点选择方式(例如// node)可能是值得的。
答案 2 :(得分:1)
使用XslCompiledTransform使用xsl执行此操作,但请确保缓存XslCompiledTransform,因为编译速度很慢,执行速度非常快。
所以:
这很快,保持代码清洁,在更改排序实现方面你很灵活;它只是编辑一个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;
}