it-swarm.dev

Convertendo XDocument para XmlDocument e vice-versa

É um problema muito simples que eu tenho. Eu uso o XDocument para gerar um arquivo XML. Eu quero então retornar como uma classe XmlDocument. E eu tenho uma variável XmlDocument que eu preciso converter de volta para XDocument para acrescentar mais nós.

Então, qual é o método mais eficiente para converter XML entre XDocument e XmlDocument? (Sem usar nenhum armazenamento temporário em um arquivo.)

182
Wim ten Brink

Você pode usar o construído em xDocument.CreateReader () e um XmlNodeReader para converter e para trás.

Colocando isso em um método de extensão para facilitar o trabalho.

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

Fontes:

291
Mark Coleman

Para mim esta solução de linha única funciona muito bem

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

Se você precisar converter a instância de System.Xml.Linq.XDocument na instância do System.Xml.XmlDocument esse método de extensão ajudará você a não perder a declaração XML na instância XmlDocument resultante :

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

Espero que ajude!

5
Dmitry Pavlov

Há uma discussão sobre http://blogs.msdn.com/marcelolr/archive/2009/03/13/fast-way-to-convert-xmldocument-into-xdocument.aspx

Parece que ler um XDocument através de um XmlNodeReader é o método mais rápido. Veja o blog para mais detalhes.

4
paul

Você poderia tentar escrever o XDocument para um XmlWriter canalizado para um XmlReader para um XmlDocument.

Se eu entendi os conceitos corretamente, uma conversão direta não é possível (a estrutura interna é diferente/simplificada com o XDocument). Mas então eu posso estar errado ...

4
Daren Thomas