将XDocument转换为XmlDocument,反之亦然

时间:2009-10-02 09:29:54

标签: c# xml linq-to-xml

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

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

7 个答案:

答案 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)

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

的讨论

似乎通过 XmlNodeReader 读取XDocument是最快的方法。有关详细信息,请参阅博客。

答案 6 :(得分:-1)

如果您需要Win 10 UWP兼容版本:

varSuppliercode