Каков наилучший способ сортировки узлов в XmlDocument? (.Сеть) - PullRequest
1 голос
/ 31 октября 2008

Я использовал таблицу стилей XSL для сортировки, но она кажется очень медленной. Есть ли более эффективный способ?

Это плоский список узлов, если я преобразовываю узлы в объект и сортирую в GenericList, это поможет?

РЕДАКТИРОВАТЬ Мне не нужен конечный результат для XML.

Ответы [ 3 ]

1 голос
/ 31 октября 2008

Возможно, стоит сначала проверить, что вы не используете неэффективный способ выбора узлов, например, //node.

.
1 голос
/ 31 октября 2008

Сделайте это с xsl, используя XslCompiledTransform, но убедитесь, что вы кэшируете XslCompiledTransform, потому что компиляция медленная, выполнение очень быстрое.

Итак:

  1. Напишите xsl, соответствующий вашему xml, отсортируете их и получите отсортированный список в качестве вывода
  2. Получите XslCompiledTransform, содержащий этот xsl из кэша, и, если он не существует, создайте его и вставьте в кеш
  3. Превратите ваш xml через xsl в новый 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;
}
1 голос
/ 31 октября 2008

По моему опыту, XSL - один из лучших способов, однако общая скорость немного неуклюжа, когда вы начинаете работать с большими входными файлами.

Вы могли бы бросить свой собственный вид, но, честно говоря, я не думаю, что это будет немного быстрее.

Единственный другой возможный вариант, который я могу придумать, - это загрузить в dataview или что-то еще и отсортировать его там, и вернуться в XML, но это кажется неправильным способом.

РЕДАКТИРОВАТЬ - Исходя из добавленной вами информации, ДА, я вполне уверен, что загрузка в список будет намного быстрее ..... вам нужно будет повторить проверку, но если в любом случае, он вам нужен в другом формате.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...