将XDocument转换为XmlDocument,反之亦然

这是一个非常简单的问题,我有。 我使用XDocument来生成一个XML文件。 然后我想要返回它作为一个XmlDocument类。 我有一个XmlDocumentvariables,我需要转换回XDocument以追加更多的节点。

那么,在XDocument和XmlDocument之间转换XML的最有效的方法是什么? (不使用任何临时存储在文件中)

您可以使用内置的xDocument.CreateReader()和一个XmlNodeReader来回转换。

把它放到一个扩展方法,使其更容易处理。

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

资料来源:

对我来说,这种单线解决scheme效果很好

 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.ToString()); return doc.DocumentElement; } #endregion 

这个扩展的用法比简单地使用这样的东西

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

如果您需要将System.Xml.Linq.XDocument的实例转换为System.Xml.XmlDocument的实例,则此扩展方法将帮助您不会在生成的XmlDocument实例中丢失XML声明

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

希望有所帮助!

您可以尝试将XDocument写入一个XmlWriter以pipe理XmlDocument的XmlReader。

如果我理解了这些概念,直接转换是不可能的(内部结构与XDocument不同/简化)。 但是,那么我可能是错的

有关于http://blogs.msdn.com/marcelolr/archive/2009/03/13/fast-way-to-convert-xmldocument-into-xdocument.aspx的讨论;

看来通过XmlNodeReader读取XDocument是最快的方法。 查看博客了解更多详情。

如果您需要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); } } } }