将 XDocument 转换为 XmlDocument 或者反过来

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

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

133777 次浏览

您可以尝试将XDocument写入通过管道传输到XmlReader的XmlDocument。

如果我正确地理解了这些概念,直接转换是不可能的(内部结构不同/用XDocument简化了)。不过,我可能错了……

您可以使用内置的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);
}
}
}
}

来源:

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

似乎通过XmlNodeReader读取XDocument是最快的方法。查看博客了解更多细节。

如果你需要将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 y = XDocument.Parse(pXmldoc.OuterXml); // where pXmldoc is of type XMLDocument

如果你需要一个win10 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);
}
}
}
}