Conversion de XDocument en XmlDocument et vice versa

C’est un problème très simple que j’ai. J’utilise XDocument pour générer un fichier XML. Je veux ensuite le retourner en tant que classe XmlDocument. Et j’ai une variable XmlDocument que je dois reconvertir en XDocument pour append d’autres nœuds.

Alors, quelle est la méthode la plus efficace pour convertir XML entre XDocument et XmlDocument? (Sans utiliser de stockage temporaire dans un fichier.)

Vous pouvez utiliser xDocument.CreateReader () et un XmlNodeReader intégrés pour convertir en arrière.

Mettre cela dans une méthode d’extension pour le rendre plus facile à utiliser.

using System; using System.Xml; using System.Xml.Linq; namespace MyTest { internal class Program { private static void Main(ssortingng[] args) { var xmlDocument = new XmlDocument(); xmlDocument.LoadXml("Test"); 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); } } } } 

Sources:

Pour moi, cette solution simple fonctionne très bien

 XDocument y = XDocument.Parse(pXmldoc.OuterXml); // where pXmldoc is of type XMLDocument 
 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.ToSsortingng()); return doc.DocumentElement; } #endregion 

L’utilisation de cette extension est faite simplement en utilisant quelque chose comme ça

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

Si vous devez convertir l’instance de System.Xml.Linq.XDocument dans l’instance de System.Xml.XmlDocument, cette méthode d’extension vous aidera à ne pas perdre la déclaration XML dans l’instance XmlDocument résultante:

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

J’espère que cela pourra aider!

Vous pouvez essayer d’écrire le XDocument sur un XmlWriter relié à un XmlReader pour un XmlDocument.

Si je comprends bien les concepts, une conversion directe n’est pas possible (la structure interne est différente / simplifiée avec XDocument). Mais alors, je peux me tromper …

Il y a une discussion sur http://blogs.msdn.com/marcelolr/archive/2009/03/13/fast-way-to-convert-xmldocument-into-xdocument.aspx

Il semble que la lecture d’un XDocument via un XmlNodeReader soit la méthode la plus rapide. Voir le blog pour plus de détails.

Si vous avez besoin d’une variante compatible avec 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); } } } }