这是一个非常简单的问题。我使用XDocument生成XML文件。然后我想将它作为XmlDocument类返回。 我有一个XmlDocument变量,我需要将其转换回XDocument以追加更多节点。
那么,在XDocument和XmlDocument之间转换XML的最有效的方法是什么? (不使用文件中的任何临时存储。)
答案 0 :(得分:289)
您可以使用内置的xDocument.CreateReader()和XmlNodeReader来回转换。
将其放入Extension方法以便于使用。
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);
}
}
}
}
来源:
答案 1 :(得分:28)
对我而言,这种单线解决方案非常有效
XDocument y = XDocument.Parse(pXmldoc.OuterXml); // where pXmldoc is of type XMLDocument
答案 2 :(得分:7)
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();
答案 3 :(得分:5)
如果您需要将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;
}
}
}
希望有所帮助!
答案 4 :(得分:4)
您可以尝试将XDocument写入通过管道传输到XmlDocument的XmlReader的XmlWriter。
如果我理解正确的概念,则无法进行直接转换(内部结构与XDocument不同/简化)。但那时,我可能错了......
答案 5 :(得分:4)
似乎通过 XmlNodeReader 读取XDocument是最快的方法。有关详细信息,请参阅博客。
答案 6 :(得分:-1)
如果您需要Win 10 UWP兼容版本:
varSuppliercode