Я хотів побачити, яке із запропонованих рішень найкраще працює, тому я провів кілька порівняльних тестів. Не цікавившись, я також порівняв методи LINQ із звичайним старим методом System.Xml, запропонованим Грегом. Варіація була цікавою і не такою, яку я очікував, причому найповільніші методи були в 3 рази повільніші, ніж найшвидші .
Результати впорядковані найшвидшими та повільними:
- CreateReader - Миттєвий мисливець (0.113 секунди)
- Звичайна стара система.Xml - Грег Хурльман (0,134 секунди)
- Сукупність зі зв'язком струн - Майк Пауелл (0,324 секунди)
- StringBuilder - Vin (0,333 секунди)
- String.Join на масиві - Террі (0,360 секунд)
- String.Concat на масиві - Marcin Kosieradzki (0.364)
Метод
Я використав один XML-документ із 20 однаковими вузлами (званий "підказка"):
<hint>
<strong>Thinking of using a fake address?</strong>
<br />
Please don't. If we can't verify your address we might just
have to reject your application.
</hint>
Цифри, показані як секунди вище, є результатом вилучення "внутрішнього XML" з 20 вузлів, 1000 разів поспіль, та взяття середнього (середнього значення) 5 прогонів. Я не включав час, необхідний для завантаження та розбору XML у XmlDocument
(для методу System.Xml ) або XDocument
(для всіх інших).
Я використовував алгоритми LINQ: (C # - всі беруть XElement
"батьків" і повертають внутрішню рядок XML)
CreateReader:
var reader = parent.CreateReader();
reader.MoveToContent();
return reader.ReadInnerXml();
Об'єднайте з об'єднанням рядків:
return parent.Nodes().Aggregate("", (b, node) => b += node.ToString());
StringBuilder:
StringBuilder sb = new StringBuilder();
foreach(var node in parent.Nodes()) {
sb.Append(node.ToString());
}
return sb.ToString();
String.Join на масив:
return String.Join("", parent.Nodes().Select(x => x.ToString()).ToArray());
String.Concat у масиві:
return String.Concat(parent.Nodes().Select(x => x.ToString()).ToArray());
Я не показав тут алгоритм "Звичайний старий System.Xml", оскільки він просто викликає .InnerXml на вузлах.
Висновок
Якщо продуктивність важлива (наприклад, багато XML, часто розбирається), я б використовував CreateReader
метод Даніеля кожен раз . Якщо ви лише робите кілька запитів, можливо, ви захочете скористатися більш стислим методом агрегації Майка.
Якщо ви використовуєте XML для великих елементів з великою кількістю вузлів (можливо, 100-х), ви, мабуть, почнете бачити перевагу використання StringBuilder
методу Aggregate, але не більше CreateReader
. Я не думаю, що методи Join
та Concat
методи ніколи не будуть ефективнішими в цих умовах через штраф за перетворення великого списку у великий масив (навіть очевидний тут із меншими списками).