Подтвердить что ты не робот

Какая разница между XElement и XDocument?

В чем разница между XElement и XDocument и когда вы используете каждый?

4b9b3361

Ответ 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, только если вы хотите добавить комментарий или инструкцию обработки на корневом уровне документа.