XDocument или XmlDocument



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

677   8  

8 ответов:

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

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

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

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

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

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

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

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

как уже упоминалось в другом месте, несомненно, 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)");

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

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

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

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

Comments

    Ничего не найдено.