web-dev-qa-db-ja.com

XDocumentからXmlDocumentへの変換、およびその逆

それは私が持っている非常に単純な問題です。 XDocumentを使用してXMLファイルを生成します。次に、XmlDocumentクラスとして返します。さらに、XmlDocument変数があります。この変数をXDocumentに変換して、さらにノードを追加する必要があります。

それでは、XDocumentとXmlDocumentの間でXMLを変換する最も効率的なメソッドとは何ですか? (ファイルの一時ストレージを使用せずに。)

184
Wim ten Brink

組み込みの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);
            }
        }
    }
}

ソース:

293
Mark Coleman

私にとって、この単一行ソリューションは非常にうまく機能します

XDocument y = XDocument.Parse(pXmldoc.OuterXml); // where pXmldoc is of type XMLDocument
28
Abhi
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();
7
Robert Harvey

System.Xml.Linq.XDocumentのインスタンスをSystem.Xml.XmlDocumentのインスタンスに変換する必要がある場合、この拡張メソッドはXML宣言を失わないでください結果のXmlDocumentインスタンスで役立ちます:

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

お役に立てば幸いです!

5
Dmitry Pavlov

http://blogs.msdn.com/marcelolr/archive/2009/03/13/fast-way-to-convert-xmldocument-into-xdocument.aspx に関する議論があります

XmlNodeReaderを介してXDocumentを読み取るのが最も速い方法のようです。詳細については、ブログを参照してください。

4
paul

XmlDocumentのXmlReaderにパイプで接続されたXmlWriterにXDocumentを書き込むことができます。

概念を適切に理解していれば、直接変換することはできません(内部構造はXDocumentで異なる/簡略化されています)。しかし、その後、私は間違っているかもしれません...

4
Daren Thomas