Ahora estoy aprendiendo XmlDocument
pero acabo de encontrar XDocument
y cuando trato de buscar la diferencia o los beneficios de ellos no puedo encontrar algo útil, ¿podría decirme por qué usaría uno más? otro?XDocument o XmlDocument
Respuesta
Si está utilizando .NET versión 3.0 o inferior, tiene para usar XmlDocument
también conocido como el DOM API clásico. Del mismo modo, encontrarás que hay otras API que esperan esto.
Si tiene la opción, sin embargo, recomendaría completamente usar XDocument
aka LINQ to XML. Es mucho más simple para 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")));
Los espacios de nombres son bastante fáciles de trabajar en LINQ para XML, a diferencia de cualquier otro API XML cada vez que he 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 crear elementos con secuencias de subelementos muy fácilmente:
// 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
));
Todo es mucho más declarativo, lo que encaja con el estilo general de LINQ.
Ahora, como lo mencionó Brannon, se trata de API en memoria en lugar de transmisión (aunque XStreamingElement
admite salida diferida). XmlReader
y XmlWriter
son las formas normales de transmisión de XML en .NET, pero puede mezclar todas las API hasta cierto punto. Por ejemplo, puede transmitir un documento grande pero usar LINQ a XML colocando un XmlReader
al comienzo de un elemento, leyendo un XElement
y procesándolo, luego pasando al siguiente elemento, etc. Hay varias publicaciones en el blog sobre este tema. técnica, here's one I found with a quick search.
¿Podría decirme por qué son diferentes? Quiero decir, sí XDocument se ve bastante limpio, pero en cuanto a la diferencia de nivel DOM, ¿no son ambos xml? ¿Existe algún esquema que muestre tanto Microsoft X-DOM como el DOM que cumple con W3C? Gracias. – Tarik
¿Qué quiere decir con "esquema" y qué quiere decir con "muestra"?Sí, ambos trabajan con XML estándar, pero LINQ to XML es solo una API más agradable para la mayoría de las cosas. Mucha de la tecnología * detrás de * LINQ to XML simplemente no estaba disponible antes de .NET 3.5. –
Me refiero a si sus modelos de objetos documentales son diferentes? – Tarik
XDocument
es de la API LINQ a XML, y XmlDocument
es la API estándar de DOM para XML. Si conoce DOM correctamente y no quiere aprender LINQ a XML, vaya con XmlDocument
. Si eres nuevo en ambos, echa un vistazo a this page que compara los dos y elige cuál te gusta más.
Acabo de empezar a usar LINQ to XML, y me encanta la forma de crear un documento XML con una construcción funcional. Es realmente bueno. DOM es torpe en comparación.
XmlDocument
es ideal para desarrolladores que están familiarizados con el modelo de objetos XML DOM. Ha existido por un tiempo, y más o menos corresponde a un estándar W3C. Admite la navegación manual y la selección de nodos XPath
.
XDocument
potencia la característica LINQ to XML en .NET 3.5. Hace un uso intensivo de IEnumerable<>
y puede ser más fácil trabajar con C# directo.
Ambos modelos de documentos requieren que cargue todo el documento en la memoria (a diferencia de XmlReader
por ejemplo).
Creo que quería decir "y puede ser más fácil trabajar con VB.net directo". Porque VB admite la creación directa de elementos donde C# aún requiere código. – Brain2000
Además, tenga en cuenta que XDocument
es compatible con Xbox 360 y Windows Phone OS 7.0. Si los selecciona, desarrolle para XDocument
o migre desde XmlDocument
.
Creo que XDocument
hace muchas más llamadas a la creación de objetos. Sospecho que para cuando maneje una gran cantidad de documentos XML, XMLDocument
será más rápido.
Un lugar en el que esto sucede es en la gestión de datos escaneados. Muchas herramientas de escaneo envían sus datos en XML (por razones obvias). Si tiene que procesar muchos de estos archivos de escaneo, creo que tendrá un mejor rendimiento con XMLDocument
.
Creo que debería respaldar su comentario con cifras la próxima vez, ya que creo que puede estar equivocado. Consulte http://blogs.msdn.com/b/codejunkie/archive/2008/10/08/xmldocument-vs-xelement-performance.aspx – mike
me sorprende que ninguna de las respuestas hasta el momento menciona el hecho de que XmlDocument
no proporciona ninguna información de la línea, mientras XDocument
hace (a través de la interfaz IXmlLineInfo
).
Esto puede ser una característica crítica en algunos casos (por ejemplo, si desea informar errores en un XML, o hacer un seguimiento de dónde se definen los elementos en general) y es mejor que lo tenga en cuenta antes de comenzar a implementar usando XmlDocument
, para descubrir más tarde, debe cambiarlo todo.
Y me sorprende que nadie haya notado que su afirmación es inversamente cierta. XmlDocument proporciona la información de línea, mientras que XDocument no. – VVS
@VVS: por un momento me preocupé por haber cometido un terrible error tipográfico, pero después de verificarlo dos veces, confirmo que 'XDocument' proporciona información de línea. Consulte [XDocument.Load] (https://msdn.microsoft.com/en-us/library/bb538371%28v=vs.110%29.aspx) con 'LoadOptions.SetLineInfo' como segundo argumento. Si conoce una forma de obtener información de línea con 'XmlDocument', tengo curiosidad; Cuando escribí esta respuesta, no pude encontrar ninguna. Esta otra respuesta parece confirmar: https://stackoverflow.com/a/33622102/253883 –
Además del comentario anterior de W0lands, lo mismo se aplica al construir proyectos Unity3D para Windows 8. También necesitará usar XDocument en este escenario.
Como se mencionó en otra parte, sin duda, Linq a Xml hace que la creación y alteración de documentos xml sea muy fácil en comparación con XmlDocument
, y la sintaxis XNamespace ns + "elementName"
hace que la lectura sea placentera al tratar con espacios de nombres.
Una cosa vale la pena mencionar a xsl
y xpath
recalcitrantes a tener en cuenta es que es posible todavía ejecutar arbitrarias xpath 1.0
expresiones en LINQ 2 XML XNodes
incluyendo:
using System.Xml.XPath;
y entonces podremos navegar y datos del proyecto usando xpath
a través de estos métodos de extensión:
- XPathSelectElement - Single Element
- XPathSelectElements - Conjunto de nodos
- XPathEvaluate - escalares y otros
Por ejemplo, teniendo en cuenta el documento XML:
<xml>
<foo>
<baz id="1">10</baz>
<bar id="2" special="1">baa baa</bar>
<baz id="3">20</baz>
<bar id="4" />
<bar id="5" />
</foo>
<foo id="123">Text 1<moo />Text 2
</foo>
</xml>
podemos evaluar:
var node = xele.XPathSelectElement("/xml/foo[@id='123']");
var nodes = xele.XPathSelectElements(
"//moo/ancestor::xml/descendant::baz[@id='1']/following-sibling::bar[not(@special='1')]");
var sum = xele.XPathEvaluate("sum(//foo[not(moo)]/baz)");
- 1. Rendimiento: XDocument versus XmlDocument
- 2. XMLDocument -> Byte [] ... ¿cómo volver a XMLDocument?
- 3. inserción XmlDocument en un nodo XmlDocument
- 4. ¿Cómo obtengo una NameTable de un XDocument?
- 5. Xdocument no imprime la declaración
- 6. ¿Cómo serializo un objeto en un XDocument?
- 7. sorting toda XDocument basan en subnodos
- 8. Cómo eliminar el atributo xmlns de XDocument?
- 9. creación del archivo XML usando XDocument en C#
- 10. Crear un nuevo XDocument a partir de un XDocument existente
- 11. Usando xmlDocument añadir nodo
- 12. C# XmlDocument SelectNodes
- 13. XmlDocument - cargar desde cadena?
- 14. Convertir XmlDocument para cuerdas
- 15. Windows Phone - XmlDocument no se pudo encontrar
- 16. ¿Por qué XmlDocument no es dinámico en .NET 4?
- 17. XmlDocument Guardar mantiene presentar abierta
- 18. Analizando XML usando XDocument
- 19. Convierte XDocument a Stream
- 20. nodos Extracción de XDocument
- 21. Contar nodos secundarios en XDocument
- 22. Perdiendo nuevas líneas con XDocument
- 23. Serializar el objeto a XmlDocument
- 24. Rellenar XDocument de la Cadena
- 25. excepción inesperada de XDocument constructor
- 26. devolver xdocument del servicio wcf
- 27. Lea el primer nodo de XMLDocument
- 28. Cómo agregar XMLNamespace a un XmlDocument
- 29. ¿Cómo deserializar XMLDocument para objetar en C#?
- 30. XMLDocument, diferencia entre innerxml y outerxml
me pregunto por qué el Los chicos de documentación en Microsoft no pusieron ninguna nota o comentario en MSDN para aclarar sus diferencias o cuándo usar qué. –
Información sobre msdn: https://msdn.microsoft.com/en-us/library/bb387021.aspx?f=255&MSPPError=-2147217396. Y una pregunta de rendimiento: http://stackoverflow.com/questions/4383919/performance-xdocument-versus-xmldocument. Personalmente, me ha resultado más fácil trabajar con LINQ a XML. – nawfal