将XDocument转换为XmlDocument,反之亦然

Wim*_*ink 187 c# xml linq-to-xml

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

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

Mar*_*man 299

您可以使用内置的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);
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

资料来源:

  • 为什么ToXDocument()包含对MoveToContent()的调用?这看起来它会跳过文档元素之前的任何内容,例如XML文档顶部的任何注释和处理指令. (5认同)
  • 你不必担心处理在ToXmlDocument方法中创建的阅读器吗? (4认同)

Abh*_*bhi 28

对我来说,这种单线解决方案非常有效

XDocument y = XDocument.Parse(pXmldoc.OuterXml); // where pXmldoc is of type XMLDocument
Run Code Online (Sandbox Code Playgroud)

  • 不要使用它 - 虽然这确实可以正常工作,但效率非常低,因为它将整个XML树转换为单个字符串并在之后再次解析. (20认同)
  • 请参阅此文章,了解不同方法的基准知识https://blogs.msdn.microsoft.com/xmlteam/2009/03/31/converting-from-xmldocument-to-xdocument/ (3认同)
  • 我正在开发实用程序,而不是生产代码。对我来说简单易行比性能更重要。 (2认同)

Rob*_*vey 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
Run Code Online (Sandbox Code Playgroud)

使用这种扩展不仅仅是使用这样的东西

System.Xml.XmlElement systemXml = (new XElement("nothing")).ToXmlElement();
System.Xml.Linq.XElement linqXml = systemXml.ToXElement();
Run Code Online (Sandbox Code Playgroud)

  • 不要使用它 - 虽然这确实可以正常工作,但效率非常低,因为它将整个XML树转换为单个字符串并在之后再次解析. (13认同)

Dmi*_*lov 5

如果需要将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; 
        } 
    } 
}
Run Code Online (Sandbox Code Playgroud)

希望有所帮助!