XDocumento o XmlDocumento
Ahora estoy aprendiendo XmlDocument
, pero me acabo de encontrar XDocument
y 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?
Si está utilizando .NET versión 3.0 o inferior, debe utilizar XmlDocument
la 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 XDocument
tambié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 XStreamingElement
admiten salida diferida). XmlReader
y XmlWriter
son 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 XmlReader
al inicio de un elemento, leyendo un XElement
de é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 .
Me sorprende que ninguna de las respuestas hasta ahora mencione el hecho de que XmlDocument
no proporciona información de línea , mientras que sí XDocument
lo hace (a través de la IXmlLineInfo
interfaz).
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.