Зараз я навчаюсь, 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
.