Класс расширений MSDN - System.Xml.XPath гласит:
При использовании этих методов существует некоторое снижение производительности. Использование запросов LINQ to XML повышает производительность.
И XPathSelectElement — это метод расширения.
У меня есть следующий XML. Мне нужно найти сообщения и объединить их. Проблема в том, что мне нужно выбрать только сообщения, которые находятся в разделе Status/StatusMsg/StatusDetail. С помощью Descendants я получаю все сообщения, даже за пределами обязательных элементов.
Этого можно правильно добиться с помощью XPathSelectElement. Но поскольку XPathSelectElement является методом расширения, он имеет некоторое снижение производительности, как показано в обзоре производительности LINQ to XML с XPath, в котором говорится:
В большинстве случаев случаях выполнение запроса XPath приведет к увеличению времени выполнения в 5 раз по сравнению с запросом с использованием стандартного LINQ to XML.
Каков наилучший способ сделать это без использования метода расширения в LINQ to XML с использованием C#?
Примечание. Есть ли способ настроить Descendants для этой цели?
XML
XDocument xDoc = XDocument.Parse(@"
INVOICE
2
A
B
C
OUTSIDE
");
КОД
// Descendants
var messageArrayWithOutside = xDoc.Descendants(@"StatusDetail")
.Select(
x => x.Element("Message") == null ? String.Empty : x.Element("Message").Value.Trim()
).ToArray();
var textAll = string.Join(", ", messageArrayWithOutside);
//XPathSelectElements
var messageArray = xDoc.XPathSelectElements(@"Status/StatusMsg/StatusDetail")
.Select(
x => x.Element("Message") == null ? String.Empty : x.Element("Message").Value.Trim()
).ToArray();
var text = string.Join(", ", messageArray);
ОБНОВЛЕНИЕ
XPath кажется быстрее, чем использование Descendants в два раза. Есть идеи, почему?
// Descendants
Stopwatch stopWatchDescendants = new Stopwatch();
stopWatchDescendants.Start();
var messageArrayDecendants = xDoc.Descendants("StatusMsg")
.Descendants("StatusDetail")
.Select(
x => x.Element("Message") == null ?string.Empty : x.Element("Message").Value.Trim()
).ToArray();
var textDecendants = string.Join(", ", messageArrayDecendants);
stopWatchDescendants.Stop();
TimeSpan tsDescendants = stopWatchDescendants.Elapsed;
//XPathSelectElements
Stopwatch stopWatchXPath = new Stopwatch();
stopWatchXPath.Start();
var messageArrayXPath = xDoc.XPathSelectElements(@"Status/StatusMsg/StatusDetail")
.Select(
x => x.Element("Message") == null ? String.Empty : x.Element("Message").Value.Trim()
).ToArray();
var textXPath = string.Join(", ", messageArrayXPath);
stopWatchXPath.Stop();
TimeSpan tsXPath = stopWatchXPath.Elapsed;
if (tsXPath > tsDescendants)
{
Console.WriteLine("LINQ is fast");
}
if (tsDescendants > tsXPath)
{
Console.WriteLine("XPath is fast");
}
Console.WriteLine("XPath :" + tsXPath.ToString());
Console.WriteLine("LINQ :" + tsDescendants.ToString());
Подробнее здесь: https://stackoverflow.com/questions/155 ... ion-method
Выберите элемент XML без использования метода расширения. ⇐ C#
Место общения программистов C#
-
Anonymous
1716440298
Anonymous
Класс расширений MSDN - System.Xml.XPath гласит:
При использовании этих методов существует некоторое снижение производительности. Использование запросов LINQ to XML повышает производительность.
И XPathSelectElement — это метод расширения.
У меня есть следующий XML. Мне нужно найти сообщения и объединить их. Проблема в том, что мне нужно выбрать только сообщения, которые находятся в разделе Status/StatusMsg/StatusDetail. С помощью Descendants я получаю все сообщения, даже за пределами обязательных элементов.
Этого можно правильно добиться с помощью XPathSelectElement. Но поскольку XPathSelectElement является методом расширения, он имеет некоторое снижение производительности, как показано в обзоре производительности LINQ to XML с XPath, в котором говорится:
В большинстве случаев случаях выполнение запроса XPath приведет к увеличению времени выполнения в 5 раз по сравнению с запросом с использованием стандартного LINQ to XML.
Каков наилучший способ сделать это без использования метода расширения в LINQ to XML с использованием C#?
Примечание. Есть ли способ настроить Descendants для этой цели?
[b]XML[/b]
XDocument xDoc = XDocument.Parse(@"
INVOICE
2
A
B
C
OUTSIDE
");
[b]КОД[/b]
// Descendants
var messageArrayWithOutside = xDoc.Descendants(@"StatusDetail")
.Select(
x => x.Element("Message") == null ? String.Empty : x.Element("Message").Value.Trim()
).ToArray();
var textAll = string.Join(", ", messageArrayWithOutside);
//XPathSelectElements
var messageArray = xDoc.XPathSelectElements(@"Status/StatusMsg/StatusDetail")
.Select(
x => x.Element("Message") == null ? String.Empty : x.Element("Message").Value.Trim()
).ToArray();
var text = string.Join(", ", messageArray);
[b]ОБНОВЛЕНИЕ[/b]
XPath кажется быстрее, чем использование Descendants в два раза. Есть идеи, почему?
// Descendants
Stopwatch stopWatchDescendants = new Stopwatch();
stopWatchDescendants.Start();
var messageArrayDecendants = xDoc.Descendants("StatusMsg")
.Descendants("StatusDetail")
.Select(
x => x.Element("Message") == null ?string.Empty : x.Element("Message").Value.Trim()
).ToArray();
var textDecendants = string.Join(", ", messageArrayDecendants);
stopWatchDescendants.Stop();
TimeSpan tsDescendants = stopWatchDescendants.Elapsed;
//XPathSelectElements
Stopwatch stopWatchXPath = new Stopwatch();
stopWatchXPath.Start();
var messageArrayXPath = xDoc.XPathSelectElements(@"Status/StatusMsg/StatusDetail")
.Select(
x => x.Element("Message") == null ? String.Empty : x.Element("Message").Value.Trim()
).ToArray();
var textXPath = string.Join(", ", messageArrayXPath);
stopWatchXPath.Stop();
TimeSpan tsXPath = stopWatchXPath.Elapsed;
if (tsXPath > tsDescendants)
{
Console.WriteLine("LINQ is fast");
}
if (tsDescendants > tsXPath)
{
Console.WriteLine("XPath is fast");
}
Console.WriteLine("XPath :" + tsXPath.ToString());
Console.WriteLine("LINQ :" + tsDescendants.ToString());
Подробнее здесь: [url]https://stackoverflow.com/questions/15539428/select-xml-element-without-using-extension-method[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия