내가 가진 매우 간단한 문제입니다. XDocument를 사용하여 XML 파일을 생성합니다. 그런 다음 XmlDocument 클래스로 반환하고 싶습니다. 그리고 더 많은 노드를 추가하기 위해 XDocument로 다시 변환 해야하는 XmlDocument 변수가 있습니다.
그렇다면 XDocument와 XmlDocument간에 XML을 변환 하는 가장 효율적인 방법 은 무엇 입니까? (파일에 임시 저장소를 사용하지 않고)
내가 가진 매우 간단한 문제입니다. 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);
}
}
}
}
출처 :
XmlDocument
(속성)과 XDocument
(노드) 사이에서 다르게 처리 됩니다. 선언을 유지하려면 명시 적으로 처리해야합니다 ( blogs.msdn.com/b/ericwhite/archive/2010/03/05/… 또는 @Dmitry 의 답변 stackoverflow.com/a/8894680/2688 )
나 에게이 단선 솔루션은 매우 잘 작동합니다.
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;
}
}
}
희망이 도움이됩니다!
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);
}
}
}
}