XDocument를 XmlDocument로 또는 그 반대로 변환


189

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

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

답변:


304

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

출처 :


4
ToXmlDocument 메서드에서 만든 리더를 폐기하는 것에 대해 걱정할 필요가 없습니까?
CodeMonkey1313

5
ToXDocument ()에 MoveToContent ()에 대한 호출이 포함 된 이유는 무엇입니까? XML 문서 맨 위에있는 주석 및 처리 지침과 같이 문서 요소보다 먼저 내용을 건너 뛰는 것처럼 보입니다.
redcalx

@locster 선언은 XmlDocument(속성)과 XDocument(노드) 사이에서 다르게 처리 됩니다. 선언을 유지하려면 명시 적으로 처리해야합니다 ( blogs.msdn.com/b/ericwhite/archive/2010/03/05/… 또는 @Dmitry 의 답변 stackoverflow.com/a/8894680/2688 )
bdukes

불행히도 이것은 Windows 10 UWP에서 작동하지 않습니다. 관심있는 사람이 있으면 해당 플랫폼에 대한 솔루션을 아래에 게시했습니다.
bc3tech

28

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

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

21
이것을 사용하지 마십시오-이것이 올바르게 작동하는 동안 전체 XML 트리를 단일 문자열로 변환하고 나중에 다시 구문 분석하기 때문에 매우 비효율적입니다.
Lucero

3
다양한 접근 방식의 벤치 마크 ( blogs.msdn.microsoft.com/xmlteam/2009/03/31/)에
Bernard Vander Beken

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

13
이것을 사용하지 마십시오-이것이 올바르게 작동하는 동안 전체 XML 트리를 단일 문자열로 변환하고 나중에 다시 구문 분석하기 때문에 매우 비효율적입니다.
Lucero

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

희망이 도움이됩니다!


4

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

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



-1

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);
                }
            }
        }
    }
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.