Теперь я изучаю XmlDocument
, но я только что столкнулся с XDocument
, и когда я пытаюсь найти разницу или выгоды от них, я не могу найти что-то полезное, не могли бы вы рассказать мне, почему вы будете использовать один за другим?
XDocument или XmlDocument
Ответ 1
Если вы используете .NET версии 3.0 или ниже, вы должны использовать XmlDocument
, а также классический DOM API. Аналогичным образом вы обнаружите, что есть и другие API, которые ожидают этого.
Если вы получите выбор, я бы рекомендовал использовать XDocument
aka 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, в отличие от любого другого XML-API, который я когда-либо видел:
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
из него и обрабатывая его, затем переходите к следующему элементу и т.д. Существуют различные сообщения в блоге об этой технике, здесь, которую я нашел с быстрым поиском.
Ответ 2
Я удивлен, что ни один из ответов до сих пор не упоминает тот факт, что XmlDocument
не содержит строковой информации, а XDocument
делает (через IXmlLineInfo
интерфейс.)
Это может быть важной особенностью в некоторых случаях (например, если вы хотите сообщать об ошибках в XML или отслеживать, где элементы определены в целом), и вам лучше знать об этом, прежде чем вы с радостью начнете использовать XmlDocument
, чтобы потом обнаружить, что вам нужно все это изменить.
Ответ 3
XmlDocument
отлично подходит для разработчиков, знакомых с объектной моделью XML DOM. Это было какое-то время, и более или менее соответствует стандарту W3C. Он поддерживает ручную навигацию, а также XPath
node.
XDocument
поддерживает функцию LINQ to XML в .NET 3.5. Он сильно использует IEnumerable<>
и с ним проще работать с прямым С#.
Обе модели документов требуют, чтобы вы загрузили весь документ в память (в отличие от XmlReader
, например).
Ответ 4
XDocument
- это LINQ to XML API, а XmlDocument
- стандартный API DOM-стиля для XML. Если вы хорошо знаете DOM и не хотите изучать LINQ to XML, перейдите к XmlDocument
. Если вы не знакомы с обоими, просмотрите эту страницу, которая сравнивает их, и выберите, какой вам нравится внешний вид.
Я только начал использовать LINQ to XML, и мне нравится, как вы создаете XML-документ, используя функциональную конструкцию. Это действительно приятно. DOM является неуклюжим в сравнении.
Ответ 5
Как упоминалось в другом месте, несомненно, Linq to Xml делает создание и изменение XML-документов легким по сравнению с XmlDocument
, а синтаксис XNamespace ns + "elementName"
делает приятное чтение при работе с пространствами имен.
Одна вещь, которую стоит упомянуть для xsl
и xpath
, следует отметить, что возможно выполнять произвольные выражения xpath 1.0
в Linq 2 Xml XNodes
, включая:
using System.Xml.XPath;
а затем мы можем перемещаться и проектировать данные с помощью xpath
с помощью этих методов расширения:
- XPathSelectElement - Единый элемент
- XPathSelectElements - Node Установите
- XPathEvaluate - Scalaры и другие
Например, с учетом документа 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)");
Ответ 6
Также обратите внимание, что XDocument
поддерживается в Xbox 360 и Windows Phone OS 7.0.
Если вы нацелитесь на них, развернитесь для XDocument
или перейдите с XmlDocument
.
Ответ 7
в дополнение к замечанию W0lands выше, то же самое применимо при создании проектов Unity3D для Windows 8. Вам также нужно будет использовать XDocument в этом сценарии.
Ответ 8
Я считаю, что XDocument
делает намного больше вызовов создания объектов. Я подозреваю, что, когда вы обрабатываете много XML-документов, XMLDocument
будет быстрее.
Одно место это происходит при управлении данными сканирования. Многие инструменты сканирования выводят свои данные в XML (по понятным причинам). Если вам нужно обработать много файлов сканирования, я думаю, что у вас будет более высокая производительность с помощью XMLDocument
.