В чем разница между XElement
и XDocument
и когда вы используете каждый?
Какая разница между XElement и XDocument?
Ответ 1
XDocument представляет собой целый XML-документ. Он обычно состоит из нескольких элементов.
XElement представляет собой элемент XML (с атрибутами, дочерними элементами и т.д.). Это часть более крупного документа.
Используйте XDocument при работе со всем XML-документом, XElement при работе с элементом XML.
Например, XElement
имеет свойство HasAttributes
, указывающее, существуют ли какие-либо атрибуты в элементе, но XDocument
нет, поскольку такое свойство не имеет смысла в контексте целого XML-документа.
Ответ 2
Вот практический пример из msdn, который дает понять. Предположим, что у вас есть это в файле test.xml:
<Root>
<Child1>1</Child1>
<Child2>2</Child2>
<Child3>3</Child3>
</Root>
-
С XDocument, если вы это сделаете:
foreach (var element in XDocument.Load("test.xml").Elements()) Console.WriteLine(element);
Вы получите это обратно:
<Root> <Child1>1</Child1> <Child2>2</Child2> <Child3>3</Child3> </Root>
Чтобы получить значение в
Child1
node, вам нужно будет:var child1 = XDocument.Load("test.xml").Element("Root").Element("Child1").Value;
или
var child1 = XDocument.Load("test.xml").Root.Element("Child1").Value;
-
С XElement, если вы это сделаете:
foreach (var element in XElement.Load("test.xml").Elements()) Console.WriteLine(element);
Вы получите это обратно:
<Child1>1</Child1> <Child2>2</Child2> <Child3>3</Child3>
Чтобы получить значение в
Child1
node, вы выполните:var child1 = XElement.Load("test.xml").Element("Child1").Value;
Короче говоря, XElement
игнорирует корень node, а XDocument
doesnt. Примерно XDocument.Root = XElement
, или XDocument.Root.Elements() = XElement.Elements()
. Оба получаются из XContainer
. Еще одно небольшое отличие состоит в том, что XElement
реализует IXmlSerializable
, который я не считаю главным в основном. XElement
будет достаточно для подавляющего большинства случаев, когда вы просто хотите запросить вспомогательные узлы. Название меня смущает, поэтому я предпочитаю использовать XDocument
.
Ответ 3
От MSDN:
Обратите внимание, что вам нужно создать Объекты XDocument, если требуется конкретную функциональность, предоставляемую Класс XDocument. Во многих обстоятельства, вы можете работать напрямую с XElement. Работа с XElement - это более простое программирование модель.
XDocument происходит от XContainer. Следовательно, он может содержать дочерние узлы. Однако объекты XDocument могут иметь только один ребенок XElement node. Эта отражает стандарт XML, может быть только одним корневым элементом в XML документ.
Ответ 4
Согласно статье MSDN LINQ to XML vs. DOM в подзаголовке "Работа непосредственно с XML-элементами":
При использовании LINQ to XML вы используете класс XDocument, только если вы хотите добавить комментарий или инструкцию обработки на корневом уровне документа.