XDocument или XmlDocument

416

Теперь я изучаю XmlDocument, но я только что столкнулся с XDocument, и когда я пытаюсь найти разницу или выгоды от них, я не могу найти что-то полезное, не могли бы вы рассказать мне, почему вы будете использовать один за другим?

  • 10
    Мне интересно, почему ребята из документации в Microsoft не поместили ни одной заметки или замечания в MSDN, чтобы уточнить их различия или когда что использовать.
  • 1
    Некоторая информация о msdn : msdn.microsoft.com/en-us/library/… . И вопрос производительности: stackoverflow.com/questions/4383919/… . Лично мне было проще работать с LINQ to XML.
Теги:
xmldocument
linq-to-xml

8 ответов

441
Лучший ответ

Если вы используете .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 из него и обрабатывая его, затем переходите к следующему элементу и т.д. Существуют различные сообщения в блоге об этой технике, здесь, которую я нашел с быстрым поиском.

  • 0
    Не могли бы вы сказать мне, почему они разные? Я имею в виду, что да, XDocument выглядит довольно аккуратно, но что касается разницы в уровне DOM, разве они не xml, есть ли какая-нибудь схема, которая показывает и Microsoft X-DOM, и W3C-совместимый DOM? Благодарю.
  • 3
    Что вы подразумеваете под «схемой» и что вы подразумеваете под «шоу»? Да, они оба имеют дело со стандартным XML, но LINQ to XML - просто более приятный API для большинства вещей. Многие технологии, лежащие в основе LINQ to XML, просто не были доступны до .NET 3.5.
Показать ещё 9 комментариев
48

Я удивлен, что ни один из ответов до сих пор не упоминает тот факт, что XmlDocument не содержит строковой информации, а XDocument делает (через IXmlLineInfo интерфейс.)

Это может быть важной особенностью в некоторых случаях (например, если вы хотите сообщать об ошибках в XML или отслеживать, где элементы определены в целом), и вам лучше знать об этом, прежде чем вы с радостью начнете использовать XmlDocument, чтобы потом обнаружить, что вам нужно все это изменить.

  • 0
    И я удивлен, что никто не заметил, что ваше утверждение обратно верно. XmlDocument предоставляет информацию о строке, а XDocument - нет.
  • 3
    @VVS: вы на мгновение обеспокоили меня тем, что я сделал ужасную опечатку, но после двойной проверки я подтверждаю, что XDocument действительно предоставляет информацию о линии. См. XDocument.Load с LoadOptions.SetLineInfo в качестве второго аргумента. Если вы знаете способ получения информации о линии с помощью XmlDocument мне любопытно; назад, когда я написал этот ответ, я не смог найти ни одного. Этот другой ответ, кажется, подтверждает: stackoverflow.com/a/33622102/253883
31

XmlDocument отлично подходит для разработчиков, знакомых с объектной моделью XML DOM. Это было какое-то время, и более или менее соответствует стандарту W3C. Он поддерживает ручную навигацию, а также XPath node.

XDocument поддерживает функцию LINQ to XML в .NET 3.5. Он сильно использует IEnumerable<> и с ним проще работать с прямым С#.

Обе модели документов требуют, чтобы вы загрузили весь документ в память (в отличие от XmlReader, например).

  • 1
    Я думаю, что вы имели в виду «и может быть проще работать с прямым VB.net». Потому что VB поддерживает прямое создание элементов, где C # все еще требует кода.
22

XDocument - это LINQ to XML API, а XmlDocument - стандартный API DOM-стиля для XML. Если вы хорошо знаете DOM и не хотите изучать LINQ to XML, перейдите к XmlDocument. Если вы не знакомы с обоими, просмотрите эту страницу, которая сравнивает их, и выберите, какой вам нравится внешний вид.

Я только начал использовать LINQ to XML, и мне нравится, как вы создаете XML-документ, используя функциональную конструкцию. Это действительно приятно. DOM является неуклюжим в сравнении.

20

Как упоминалось в другом месте, несомненно, Linq to Xml делает создание и изменение XML-документов легким по сравнению с XmlDocument, а синтаксис XNamespace ns + "elementName" делает приятное чтение при работе с пространствами имен.

Одна вещь, которую стоит упомянуть для xsl и xpath, следует отметить, что возможно выполнять произвольные выражения xpath 1.0 в Linq 2 Xml XNodes, включая:

using System.Xml.XPath;

а затем мы можем перемещаться и проектировать данные с помощью xpath с помощью этих методов расширения:

Например, с учетом документа 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)");
13

Также обратите внимание, что XDocument поддерживается в Xbox 360 и Windows Phone OS 7.0. Если вы нацелитесь на них, развернитесь для XDocument или перейдите с XmlDocument.

2

в дополнение к замечанию W0lands выше, то же самое применимо при создании проектов Unity3D для Windows 8. Вам также нужно будет использовать XDocument в этом сценарии.

-8

Я считаю, что XDocument делает намного больше вызовов создания объектов. Я подозреваю, что, когда вы обрабатываете много XML-документов, XMLDocument будет быстрее.

Одно место это происходит при управлении данными сканирования. Многие инструменты сканирования выводят свои данные в XML (по понятным причинам). Если вам нужно обработать много файлов сканирования, я думаю, что у вас будет более высокая производительность с помощью XMLDocument.

  • 10
    Я думаю, что в следующий раз вы должны подкрепить свой комментарий цифрами, так как я считаю, что вы можете ошибаться. Смотрите blogs.msdn.com/b/codejunkie/archive/2008/10/08/…

Ещё вопросы

Сообщество Overcoder
Наверх
Меню