XDocument или XmlDocument
Я сейчас учусь XmlDocument но я только что столкнулся с XDocument и когда я пытаюсь найти разницу или преимущества их я не могу найти что-то полезное, не могли бы вы сказать мне, почему вы будете использовать один над другим ?
8 ответов:
если вы используете .NET версии 3.0 или ниже, вы есть использовать
XmlDocumentака классический DOM API. Точно так же вы найдете, что есть некоторые другие API, которые будут ожидать этого.если вы получаете выбор, однако, я бы тщательно рекомендовал использовать
XDocumentaka 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"); // etcLINQ 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 XmlXNodesв том числе: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поддерживается в Xbox 360 и Windows Phone OS 7.0. Если вы нацелены на них, разработайте дляXDocumentили перенести отXmlDocument.
в дополнение к комментарию W0lands выше, то же самое применяется при создании проектов Unity3D для Windows 8. В этом сценарии также необходимо использовать XDocument.
Я считаю, что
XDocumentделает намного больше вызовов для создания объектов. Я подозреваю, что для того, когда вы обрабатываете много XML-документов,XMLDocumentбудет быстрее.одно место, где это происходит, - это управление данными сканирования. Много средств сканирования данных в XML (по понятным причинам). Если вам нужно обработать много этих файлов сканирования, я думаю, что вы будете иметь лучшую производительность с
XMLDocument.
Comments