XDocumento o XmlDocumento

Resuelto Tarik asked hace 14 años • 7 respuestas

Ahora estoy aprendiendo XmlDocument, pero me acabo de encontrar XDocumenty cuando intento buscar la diferencia o los beneficios de ellos no puedo encontrar nada útil, ¿podría decirme por qué usaría uno sobre otro?

Tarik avatar Oct 09 '09 13:10 Tarik
Aceptado

Si está utilizando .NET versión 3.0 o inferior, debe utilizar XmlDocumentla API DOM clásica. Del mismo modo, encontrará que hay otras API que esperan esto.

Sin embargo, si puede elegir, le recomendaría encarecidamente utilizar XDocumenttambién conocido como LINQ to XML. Es mucho más sencillo crear documentos y procesarlos. Por ejemplo, es la diferencia entre:

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);

y

XDocument doc = new XDocument(
    new XElement("root",
                 new XAttribute("name", "value"),
                 new XElement("child", "text node")));

Es bastante fácil trabajar con espacios de nombres en LINQ to XML, a diferencia de cualquier otra API XML que haya visto:

XNamespace ns = "http://somewhere.com";
XElement element = new XElement(ns + "elementName");
// etc

LINQ to XML también funciona muy bien con LINQ: su modelo de construcción le permite construir elementos con secuencias de subelementos con mucha facilidad:

// 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
    ));

Es todo mucho más declarativo, lo que encaja con el estilo general de LINQ.

Ahora bien, como mencionó Brannon, estas son API en memoria en lugar de API de transmisión (aunque XStreamingElementadmiten salida diferida). XmlReadery XmlWriterson las formas normales de transmitir XML en .NET, pero puedes combinar todas las API hasta cierto punto. Por ejemplo, puede transmitir un documento grande pero usar LINQ to XML colocando un XmlReaderal inicio de un elemento, leyendo un XElementde él y procesándolo, luego pasando al siguiente elemento, etc. Hay varias publicaciones de blog sobre esta técnica, aquí hay uno que encontré con una búsqueda rápida .

Jon Skeet avatar Oct 09 '2009 06:10 Jon Skeet

Me sorprende que ninguna de las respuestas hasta ahora mencione el hecho de que XmlDocumentno proporciona información de línea , mientras que sí XDocumentlo hace (a través de la IXmlLineInfointerfaz).

Esta puede ser una característica crítica en algunos casos (por ejemplo, si desea informar errores en un XML o realizar un seguimiento de dónde se definen los elementos en general) y es mejor que tenga esto en cuenta antes de comenzar a implementar el uso de XmlDocument, para más adelante. descubre que tienes que cambiarlo todo.

Julien Guertault avatar Aug 29 '2012 05:08 Julien Guertault