XDocument або XmlDocument


502

Зараз я навчаюсь, XmlDocumentале я щойно зіткнувся з цим, XDocumentі коли я намагаюся шукати різницю або переваги їх, я не можу знайти щось корисне, скажіть, будь ласка, для чого ви використовуєте одне над іншим?


13
Мені цікаво, чому хлопці з документації в Microsoft не помістили жодної замітки або зауваження в MSDN, щоб уточнити їхні відмінності або коли використовувати.
Kamran Bigdely

1
Деяка інформація на сайті MSDN: msdn.microsoft.com/en-us/library / ... . І питання про ефективність: stackoverflow.com/questions/4383919/… . Особисто мені було легше працювати з LINQ до XML.
nawfal

Відповіді:


500

Якщо ви використовуєте .NET версії 3.0 або новішої, вам доведеться скористатися XmlDocumentкласичним API DOM. Так само ви знайдете, що існують деякі інші API, які очікують цього.

Якщо ви отримаєте вибір, я б радимо використовувати XDocumentака LINQ для 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 до 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 у XML, розміщуючи XmlReaderна початку елемент, читаючи XElementз нього та обробляючи його, потім переходячи до наступного елемента тощо. Про цю техніку існують різні повідомлення в блогах, ось я знайшов швидкий пошук .


Скажіть, чому вони різні? Я маю на увазі, так, XDocument виглядає досить акуратно, але що стосується різниці в рівні DOM, чи не є вони обома xml, чи є якась схема, яка показує як DOM, сумісний з Microsoft X-DOM, так і W3C? Дякую.
Тарік

3
Що ви маєте на увазі під «схемою» і що ви розумієте під «шоу»? Так, вони обидва мають стандартний XML, але LINQ до XML - це лише більш приємний API для більшості речей. Багато технологій, які стоять за LINQ до XML, просто не були доступні раніше .NET 3.5.
Джон Скіт

Я маю на увазі, чи відрізняються їх об'єктні моделі документа?
Тарік

6
Ну, вони обидва API для XML, тому в цьому сенсі вони не відрізняються, ні. Я підозрюю, що в обох є деякі обмеження (і є LINQ до XML, про який я знаю, але не можу згадати вгорі голови), але в більшості випадків ви можете просто ставитися до них як до тієї самої моделі з дещо різними уявленнями.
Джон Скіт

1
@SensorSmith: Це не охоплює всіх інших бонусів, хоча автоматичне вирівнювання послідовностей, обробка DateTime і т. Д. Ви можете додати методи розширення для всього цього, але навіщо винаходити LINQ в XML, коли ви можете просто використовувати його замість нього?
Джон Скіт

57

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

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


1
І я здивований, що ніхто не помітив, що ваше твердження обернено правдиве. XmlDocument DO надає інформацію про рядки, тоді як XDocument не робить.
VVS

4
@VVS: ти мене на хвильку хвилював, що я зробив жахливий друкарський помилок, але після подвійної перевірки я підтверджую, що XDocumentвона містить інформацію про рядки. Дивіться XDocument.Load з LoadOptions.SetLineInfoдругим аргументом. Якщо ви знаєте спосіб отримати інформацію про лінію, XmlDocumentмені цікаво; ще коли я написав цю відповідь, я не зміг її знайти. Цей інший відповідь , здається , підтверджують: stackoverflow.com/a/33622102/253883
Julien Guertault

1
"і вам краще бути в курсі цього, перш ніж радісно почати впроваджувати за допомогою XmlDocument, щоб згодом виявити, що ви повинні все це змінити." Здогадайтесь, що я щойно зробив :)
Пол

36

XmlDocumentвідмінно підходить для розробників, які знайомі з об'єктною моделлю XML DOM. Це вже деякий час, і більш-менш відповідає стандарту W3C. Він підтримує ручну навігацію, а також XPathвибір вузлів.

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

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


3
Думаю, ви мали на увазі "і працювати з VB.net можна простіше". Тому що VB підтримує пряме створення елементів, де C # все ще потребує коду.
Brain2000

24

XDocumentє від API LINQ до XML і XmlDocumentє стандартним API стилю DOM для XML. Якщо ви добре знаєте DOM і не хочете вивчати LINQ до XML, почніть XmlDocument. Якщо ви новачок для обох, перегляньте цю сторінку, яка порівнює дві, і виберіть, яка саме вам подобається, як виглядає краще.

Я тільки почав використовувати LINQ для XML, і мені подобається, як ви створюєте XML-документ за допомогою функціональної конструкції. Це справді приємно. DOM незграбний у порівнянні.


23

Як згадувалося в іншому місці, безсумнівно, 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)");

14

Також зауважте, що XDocumentпідтримується в Xbox 360 та Windows Phone OS 7.0. Якщо ви орієнтуєтесь на них, розробляйте для себе XDocumentта мігруйте з них XmlDocument.


-8

Я вважаю, що це XDocumentробить набагато більше дзвінків по створенню об'єктів. Я підозрюю, що, коли ви обробляєте багато XML-документів, XMLDocumentбуде швидше.

Це одне місце - це керування даними сканування. Багато інструментів сканування виводять свої дані в XML (з очевидних причин). Якщо вам доведеться обробити багато цих файлів сканування, я думаю, ви матимете кращі показники роботи XMLDocument.


11
Я думаю, що ви повинні наступного разу підкріпити свій коментар цифрами, оскільки я вважаю, що ви можете помилитися. Дивіться blogs.msdn.com/b/codejunkie/archive/2008/10/08/…
Майк
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.