Зараз я навчаюсь, XmlDocumentале я щойно зіткнувся з цим, XDocumentі коли я намагаюся шукати різницю або переваги їх, я не можу знайти щось корисне, скажіть, будь ласка, для чого ви використовуєте одне над іншим?
Зараз я навчаюсь, XmlDocumentале я щойно зіткнувся з цим, XDocumentі коли я намагаюся шукати різницю або переваги їх, я не можу знайти щось корисне, скажіть, будь ласка, для чого ви використовуєте одне над іншим?
Відповіді:
Якщо ви використовуєте .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з нього та обробляючи його, потім переходячи до наступного елемента тощо. Про цю техніку існують різні повідомлення в блогах, ось я знайшов швидкий пошук .
Я здивований, що жодна з відповідей поки що не згадує той факт, що XmlDocumentінформація про рядки не надається , але XDocumentтак (через IXmlLineInfoінтерфейс).
Це може бути критичною особливістю в деяких випадках (наприклад, якщо ви хочете повідомляти про помилки в XML або відслідковувати, де елементи визначені в цілому), і вам краще бути в курсі цього, перш ніж радісно почати впроваджувати використання XmlDocument, щоб пізніше вияви, що ти повинен все це змінити.
XDocumentвона містить інформацію про рядки. Дивіться XDocument.Load з LoadOptions.SetLineInfoдругим аргументом. Якщо ви знаєте спосіб отримати інформацію про лінію, XmlDocumentмені цікаво; ще коли я написав цю відповідь, я не зміг її знайти. Цей інший відповідь , здається , підтверджують: stackoverflow.com/a/33622102/253883
XmlDocumentвідмінно підходить для розробників, які знайомі з об'єктною моделлю XML DOM. Це вже деякий час, і більш-менш відповідає стандарту W3C. Він підтримує ручну навігацію, а також XPathвибір вузлів.
XDocumentзабезпечує функцію LINQ до XML у .NET 3.5. Це робить велике використання IEnumerable<>і може бути простіше працювати з прямим C #.
Обидві моделі документа вимагають завантаження всього документа в пам'ять (на відміну від, XmlReaderнаприклад,).
XDocumentє від API LINQ до XML і XmlDocumentє стандартним API стилю DOM для XML. Якщо ви добре знаєте DOM і не хочете вивчати LINQ до XML, почніть XmlDocument. Якщо ви новачок для обох, перегляньте цю сторінку, яка порівнює дві, і виберіть, яка саме вам подобається, як виглядає краще.
Я тільки почав використовувати LINQ для XML, і мені подобається, як ви створюєте XML-документ за допомогою функціональної конструкції. Це справді приємно. DOM незграбний у порівнянні.
Як згадувалося в іншому місці, безсумнівно, 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робить набагато більше дзвінків по створенню об'єктів. Я підозрюю, що, коли ви обробляєте багато XML-документів, XMLDocumentбуде швидше.
Це одне місце - це керування даними сканування. Багато інструментів сканування виводять свої дані в XML (з очевидних причин). Якщо вам доведеться обробити багато цих файлів сканування, я думаю, ви матимете кращі показники роботи XMLDocument.