XDocument или XmlDocument
Я сейчас учусь XmlDocument
но я только что столкнулся XDocument
и когда я пытаюсь найти разницу или преимущества их, я не могу найти что-то полезное, не могли бы вы сказать мне, почему вы используете один над другим?
8 ответов
Если вы используете.NET версии 3.0 или ниже, вы должны использовать XmlDocument
он же классический API DOM. Также вы обнаружите, что есть и другие API, которые ожидают этого.
Однако если у вас есть выбор, я бы настоятельно рекомендовал использовать XDocument
он же LINQ to XML. Намного проще создавать документы и обрабатывать их. Например, это разница между:
XmlDocument doc = new XmlDocument();
XmlElement root = doc.CreateElement("root");
root.SetAttribute("name", "value");
XmlElement child = doc.CreateElement("child");
child.InnerText = "text node";
root.AppendChild(child);
doc.AppendChild(root);
а также
XDocument doc = new XDocument(
new XElement("root",
new XAttribute("name", "value"),
new XElement("child", "text node")));
Пространства имен довольно просты в работе с LINQ to XML, в отличие от любого другого API XML, который я когда-либо видел:
XNamespace ns = "http://somewhere.com";
XElement element = new XElement(ns + "elementName");
// etc
LINQ to XML также очень хорошо работает с LINQ - его модель построения позволяет очень легко создавать элементы с последовательностями подэлементов:
// Customers is a List<Customer>
XElement customersElement = new XElement("customers",
customers.Select(c => new XElement("customer",
new XAttribute("name", c.Name),
new XAttribute("lastSeen", c.LastOrder)
new XElement("address",
new XAttribute("town", c.Town),
new XAttribute("firstline", c.Address1),
// etc
));
Все это гораздо более декларативно, что вписывается в общий стиль LINQ.
Теперь, как упомянул Браннон, это API-интерфейсы в памяти, а не потоковые (хотя XStreamingElement
поддерживает ленивый вывод). XmlReader
а также XmlWriter
Это нормальные способы потоковой передачи XML в.NET, но вы можете смешивать все API в некоторой степени. Например, вы можете транслировать большой документ, но использовать LINQ to XML, позиционируя XmlReader
в начале элемента, читая XElement
от этого и обработки его, затем переходя к следующему элементу и т. д. Есть различные сообщения в блоге об этой технике, вот один я нашел с быстрым поиском.
Я удивлен, что ни один из ответов до сих пор не упоминает тот факт, что XmlDocument
не предоставляет никакой информации о линии, в то время как XDocument
делает (через IXmlLineInfo
интерфейс).
В некоторых случаях это может быть критически важной функцией (например, если вы хотите сообщить об ошибках в XML или отслеживать, где элементы определены в целом), и вам лучше об этом знать, прежде чем начать успешно использовать XmlDocument
Чтобы потом узнать, нужно все это изменить.
XmlDocument
отлично подходит для разработчиков, знакомых с объектной моделью XML DOM. Это было вокруг некоторое время, и более или менее соответствует стандарту W3C. Он поддерживает ручную навигацию, а также XPath
выбор узла.
XDocument
поддерживает функцию LINQ to XML в.NET 3.5. Это делает интенсивное использование IEnumerable<>
и может быть проще работать с прямым C#.
Обе модели документов требуют загрузки всего документа в память (в отличие от XmlReader
например).
Как уже упоминалось, несомненно, Linq для Xml делает создание и изменение XML-документов на одном дыхании по сравнению с XmlDocument
и XNamespace ns + "elementName"
синтаксис обеспечивает приятное чтение при работе с пространствами имен.
Одна вещь, которую стоит упомянуть для xsl
а также xpath
Трудно отметить, что возможно выполнить произвольно xpath 1.0
выражения на Linq 2 Xml XNodes
в том числе:
using System.Xml.XPath;
а затем мы можем перемещаться и проецировать данные, используя xpath
с помощью этих методов расширения:
- XPathSelectElement - один элемент
- XPathSelectElements - набор узлов
- XPathEvaluate - Скаляры и другие
Например, учитывая документ Xml:
<xml>
<foo>
<baz id="1">10</baz>
<bar id="2" special="1">baa baa</bar>
<baz id="3">20</baz>
<bar id="4" />
<bar id="5" />
</foo>
<foo id="123">Text 1<moo />Text 2
</foo>
</xml>
Мы можем оценить:
var node = xele.XPathSelectElement("/xml/foo[@id='123']");
var nodes = xele.XPathSelectElements(
"//moo/ancestor::xml/descendant::baz[@id='1']/following-sibling::bar[not(@special='1')]");
var sum = xele.XPathEvaluate("sum(//foo[not(moo)]/baz)");
XDocument
от LINQ to XML API, и XmlDocument
является стандартным API в стиле DOM для XML. Если вы хорошо знаете DOM и не хотите изучать LINQ to XML, переходите к XmlDocument
, Если вы новичок в обоих, проверьте эту страницу, которая сравнивает эти два, и выберите, какой из них вам больше нравится.
Я только начал использовать LINQ to XML, и мне нравится, как вы создаете документ XML с использованием функциональной конструкции. Это действительно приятно. DOM неуклюжий по сравнению.
Также обратите внимание, что XDocument
поддерживается в Xbox 360 и Windows Phone OS 7.0. Если вы нацелены на них, разработайте для XDocument
или мигрировать из XmlDocument
,
В дополнение к комментарию W0lands, описанному выше, то же самое применимо при создании проектов Unity3D для Windows 8. Вам также потребуется использовать XDocument в этом сценарии.
Я полагаю, что XDocument
делает намного больше вызовов создания объекта. Я подозреваю, что когда вы обрабатываете много документов XML, XMLDocument
будет быстрее
Одним из мест, где это происходит, является управление данными сканирования. Многие средства сканирования выводят свои данные в формате XML (по понятным причинам). Если вам придется обрабатывать много этих файлов сканирования, я думаю, что вы будете иметь лучшую производительность с XMLDocument
,