2010-10-07 10 views

Respuesta

29

XDocument representa un documento XML completo. Normalmente se compone de varios elementos.

XElement representa un elemento XML (con atributos, elementos secundarios, etc.). Es parte de un documento más grande.

Utilice XDocument cuando trabaje con un documento XML completo, XElement cuando trabaje con un elemento XML.

Por ejemplo - XElement tiene un HasAttributes propiedad que indica si existe algún atributo en el elemento, sino una XDocument no, ya que este tipo de propiedad no tiene sentido en el contexto de un documento XML conjunto.

+1

_XElement no tiene ningún método de carga_: parece incorrecto, vea [Load (String)] (http://msdn.microsoft.com/en-us/library/bb298435.aspx) y [otros métodos 'Load 'de sobrecarga] (http: //msdn.microsoft.com/en-us/library/system.xml.linq.xelement.aspx). – bluish

+0

@bluish - Gracias por la corrección. Respuesta actualizada – Oded

14

De MSDN:

en cuenta que sólo tiene que crear objetos XDocument Cuando requiera la funcionalidad específica proporcionada por la clase XDocument. En muchas circunstancias , puede trabajar directamente con XElement. Trabajando directamente con XElement es un modelo de programación simple .

XDocument proviene de XContainer. Por lo tanto, puede contener nodos secundarios. Sin embargo, los objetos XDocument pueden tener solo un nodo secundario XElement. Este refleja el estándar XML que allí puede ser solo un elemento raíz en un documento XML .

16

He aquí un ejemplo práctico de msdn que lo aclara. Supongamos que tiene esto en la prueba .xml archivo:

<Root> 
    <Child1>1</Child1> 
    <Child2>2</Child2> 
    <Child3>3</Child3> 
</Root> 
  1. Con XDocument si hace esto:

    foreach (var element in XDocument.Load("test.xml").Elements()) 
        Console.WriteLine(element); 
    

    Usted consigue esta vuelta:

    <Root> 
        <Child1>1</Child1> 
        <Child2>2</Child2> 
        <Child3>3</Child3> 
    </Root> 
    

    para obtener el valor en Child1 nodo, deberás hacer:

    var child1 = XDocument.Load("test.xml").Element("Root").Element("Child1").Value; 
    

    O

    var child1 = XDocument.Load("test.xml").Root.Element("Child1").Value; 
    
  2. Con XElement si hace esto:

    foreach (var element in XElement.Load("test.xml").Elements()) 
        Console.WriteLine(element); 
    

    Usted consigue esta vuelta:

    <Child1>1</Child1> 
    <Child2>2</Child2> 
    <Child3>3</Child3> 
    

    para obtener el valor en Child1 nodo, que va a hacer:

    var child1 = XElement.Load("test.xml").Element("Child1").Value; 
    

En resumen, XElement ignora el nodo raíz, mientras que XDocument no funciona. Aproximadamente, XDocument.Root = XElement, o XDocument.Root.Elements() = XElement.Elements(). Ambos derivan de XContainer. Otra diferencia menor es que XElement implementa IXmlSerializable que no creo que importe en su mayoría. XElement sería suficiente para la gran mayoría de los casos en los que solo desea consultar los nodos secundarios. El nombre me confunde, así que prefiero usar XDocument.

0

De acuerdo con el artículo de MSDN LINQ to XML vs. DOM, bajo el subtítulo "que trabajan directamente con los elementos XML":

Al utilizar LINQ para XML, se utiliza la clase XDocument sólo si desea añadir un comentario o instrucción de procesamiento en el nivel raíz del documento.

Cuestiones relacionadas