【发布时间】:2010-12-03 06:35:25
【问题描述】:
这是我遇到的一个非常简单的问题。我使用 XDocument 生成 XML 文件。然后我想将它作为 XmlDocument 类返回。 而且我有一个 XmlDocument 变量,我需要将其转换回 XDocument 以附加更多节点。
那么,在 XDocument 和 XmlDocument 之间转换 XML 最有效的方法是什么? (不使用文件中的任何临时存储。)
【问题讨论】:
标签: c# xml linq-to-xml
这是我遇到的一个非常简单的问题。我使用 XDocument 生成 XML 文件。然后我想将它作为 XmlDocument 类返回。 而且我有一个 XmlDocument 变量,我需要将其转换回 XDocument 以附加更多节点。
那么,在 XDocument 和 XmlDocument 之间转换 XML 最有效的方法是什么? (不使用文件中的任何临时存储。)
【问题讨论】:
标签: c# xml linq-to-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);
}
}
}
}
来源:
【讨论】:
XmlDocument(作为属性)和XDocument(作为节点)之间的处理方式不同。如果您想保留声明,则需要明确处理它(参见blogs.msdn.com/b/ericwhite/archive/2010/03/05/… 或@Dmitry 的回答stackoverflow.com/a/8894680/2688)
对我来说,这个单行解决方案效果很好
XDocument y = XDocument.Parse(pXmldoc.OuterXml); // where pXmldoc is of type XMLDocument
【讨论】:
如果您需要将 System.Xml.Linq.XDocument 的实例转换为 System.Xml.XmlDocument 的实例,此扩展方法将帮助您不丢失 XML 声明生成的 XmlDocument 实例:
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 写入通过管道传输到 XmlReader 的 XmlWriter 以获得 XmlDocument。
如果我正确理解这些概念,则无法进行直接转换(内部结构与 XDocument 不同/简化)。但是,我可能错了……
【讨论】:
似乎通过 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);
}
}
}
}
【讨论】: