visual pagina oficial net convertir convert cadena c# xml linq-to-xml

pagina - xml string to object c#



Conversión de XDocument a XmlDocument y viceversa (7)

Es un problema muy simple que tengo. Yo uso XDocument para generar un archivo XML. Entonces quiero devolverlo como una clase XmlDocument. Y tengo una variable XmlDocument que necesito convertir de nuevo a XDocument para agregar más nodos.

Entonces, ¿cuál es el método más eficiente para convertir XML entre XDocument y XmlDocument? (Sin usar ningún almacenamiento temporal en un archivo)



Para mí, esta solución de línea única funciona muy bien

XDocument y = XDocument.Parse(pXmldoc.OuterXml); // where pXmldoc is of type XMLDocument


Podría intentar escribir XDocument en un XmlWriter conectado a un XmlReader para un XmlDocument.

Si entiendo los conceptos correctamente, una conversión directa no es posible (la estructura interna es diferente / simplificada con XDocument). Pero entonces, podría estar equivocado ...


Puede usar el construido en xDocument.CreateReader () y un XmlNodeReader para convertir de ida y vuelta.

Poniéndolo en un método de Extensión para que sea más fácil trabajar con él.

using System; using System.Xml; using System.Xml.Linq; namespace MyTest { internal class Program { private static void Main(string[] args) { var xmlDocument = new XmlDocument(); xmlDocument.LoadXml("<Root><Child>Test</Child></Root>"); var xDocument = xmlDocument.ToXDocument(); var newXmlDocument = xDocument.ToXmlDocument(); Console.ReadLine(); } } public static class DocumentExtensions { public static XmlDocument ToXmlDocument(this XDocument xDocument) { var xmlDocument = new XmlDocument(); using(var xmlReader = xDocument.CreateReader()) { xmlDocument.Load(xmlReader); } return xmlDocument; } public static XDocument ToXDocument(this XmlDocument xmlDocument) { using (var nodeReader = new XmlNodeReader(xmlDocument)) { nodeReader.MoveToContent(); return XDocument.Load(nodeReader); } } } }

Fuentes:


Si necesita convertir la instancia de System.Xml.Linq.XDocument en la instancia de System.Xml.XmlDocument, este método de extensión le ayudará a no perder la declaración XML en la instancia de XmlDocument resultante:

using System.Xml; using System.Xml.Linq; namespace www.dimaka.com { internal static class LinqHelper { public static XmlDocument ToXmlDocument(this XDocument xDocument) { var xmlDocument = new XmlDocument(); using (var reader = xDocument.CreateReader()) { xmlDocument.Load(reader); } var xDeclaration = xDocument.Declaration; if (xDeclaration != null) { var xmlDeclaration = xmlDocument.CreateXmlDeclaration( xDeclaration.Version, xDeclaration.Encoding, xDeclaration.Standalone); xmlDocument.InsertBefore(xmlDeclaration, xmlDocument.FirstChild); } return xmlDocument; } } }

¡Espero que ayude!


Si necesita una variante compatible con Win 10 UWP:

using DomXmlDocument = Windows.Data.Xml.Dom.XmlDocument; public static class DocumentExtensions { public static XmlDocument ToXmlDocument(this XDocument xDocument) { var xmlDocument = new XmlDocument(); using (var xmlReader = xDocument.CreateReader()) { xmlDocument.Load(xmlReader); } return xmlDocument; } public static DomXmlDocument ToDomXmlDocument(this XDocument xDocument) { var xmlDocument = new DomXmlDocument(); using (var xmlReader = xDocument.CreateReader()) { xmlDocument.LoadXml(xmlReader.ReadOuterXml()); } return xmlDocument; } public static XDocument ToXDocument(this XmlDocument xmlDocument) { using (var memStream = new MemoryStream()) { using (var w = XmlWriter.Create(memStream)) { xmlDocument.WriteContentTo(w); } memStream.Seek(0, SeekOrigin.Begin); using (var r = XmlReader.Create(memStream)) { return XDocument.Load(r); } } } public static XDocument ToXDocument(this DomXmlDocument xmlDocument) { using (var memStream = new MemoryStream()) { using (var w = XmlWriter.Create(memStream)) { w.WriteRaw(xmlDocument.GetXml()); } memStream.Seek(0, SeekOrigin.Begin); using (var r = XmlReader.Create(memStream)) { return XDocument.Load(r); } } } }


using System.Xml; using System.Xml.Linq; #region Extention Method public static XElement ToXElement(this XmlElement element) { return XElement.Parse(element.OuterXml); } public static XmlElement ToXmlElement(this XElement element) { var doc = new XmlDocument(); doc.LoadXml(element.ToString()); return doc.DocumentElement; } #endregion

El uso de esta extensión se realiza simplemente usando algo como esto

System.Xml.XmlElement systemXml = (new XElement("nothing")).ToXmlElement(); System.Xml.Linq.XElement linqXml = systemXml.ToXElement();