[C#] XDocument를 XmlDocument로 또는 그 반대로 변환

내가 가진 매우 간단한 문제입니다. XDocument를 사용하여 XML 파일을 생성합니다. 그런 다음 XmlDocument 클래스로 반환하고 싶습니다. 그리고 더 많은 노드를 추가하기 위해 XDocument로 다시 변환 해야하는 XmlDocument 변수가 있습니다.

그렇다면 XDocument와 XmlDocument간에 XML을 변환 하는 가장 효율적인 방법 은 무엇 입니까? (파일에 임시 저장소를 사용하지 않고)



답변

내장 된 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);
            }
        }
    }
}

출처 :


답변

나 에게이 단선 솔루션은 매우 잘 작동합니다.

XDocument y = XDocument.Parse(pXmldoc.OuterXml); // where pXmldoc is of type XMLDocument


답변

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();


답변

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;
        }
    }
}

희망이 도움이됩니다!


답변

XmlDocument의 XmlReader로 파이프 된 XmlWriter에 XDocument를 쓸 수 있습니다.

개념을 올바르게 이해하면 직접 변환 할 수 없습니다 (XDocument와 내부 구조가 다르거 나 단순화 됨). 그러나 나는 틀렸다.


답변

http://blogs.msdn.com/marcelolr/archive/2009/03/13/fast-way-to-convert-xmldocument-into-xdocument.aspx에 대한 토론이 있습니다.

을 통해하여 XDocument를 읽는 것 같다 XmlNodeReader하는 것이 가장 빠른 방법입니다. 자세한 내용은 블로그를 참조하십시오.


답변

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);
                }
            }
        }
    }