IT

XDocument를 XmlDocument로 변환하거나 그 반대의 경우

itgroup 2023. 11. 4. 10:34
반응형

XDocument를 XmlDocument로 변환하거나 그 반대의 경우

제가 가지고 있는 아주 간단한 문제입니다.저는 XML 파일을 생성하기 위해 XDocument를 사용합니다.그럼 XmlDocument 클래스로 반품하고 싶습니다.그리고 XmlDocument 변수를 추가하기 위해 XDocument로 다시 변환해야 합니다.

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

내장된 xDocument를 사용할 수 있습니다.Reader()와 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

시스템 인스턴스를 변환해야 하는 경우.Xml.Linq.시스템 인스턴스에 X 문서화.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 에서 토론이 있습니다.

XmlNodeReader를 통해 XD 문서를 읽는 것이 가장 빠른 방법인 것 같습니다.자세한 내용은 블로그를 참고하세요.

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

언급URL : https://stackoverflow.com/questions/1508572/converting-xdocument-to-xmldocument-and-vice-versa

반응형