XDDocument को XmlDocument और इसके विपरीत में परिवर्तित करना


189

यह एक बहुत ही सरल समस्या है जो मेरे पास है। मैं XML फ़ाइल बनाने के लिए XDocument का उपयोग करता हूं। मैं इसे एक XmlDocument वर्ग के रूप में वापस करना चाहता हूं। और मेरे पास एक XmlDocument चर है जिसे मुझे अधिक नोड्स संलग्न करने के लिए वापस XDocument में बदलने की आवश्यकता है।

तो, XDocument और XmlDocument के बीच XML को परिवर्तित करने के लिए सबसे प्रभावी तरीका क्या है ? (किसी फ़ाइल में किसी भी अस्थायी संग्रहण का उपयोग किए बिना।)

जवाबों:


304

आप xDocument.CreateReader () और XmlNodeReader को आगे और पीछे परिवर्तित करने के लिए बिल्ट का उपयोग कर सकते हैं।

इसे विस्तार कार्य में लाना आसान बनाने के लिए।

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 विधि में बनाए गए पाठक को निपटाने के लिए आपको चिंता करने की ज़रूरत नहीं होगी?
कोडमोनकी 1313

5
ToXDocument () में MoveToContent () के लिए कॉल क्यों है? ऐसा लगता है कि यह डॉक्यूमेंट एलिमेंट के आगे किसी भी कंटेंट को छोड़ देगा, जैसे कि XML डॉक के शीर्ष पर कोई टिप्पणी और प्रोसेसिंग निर्देश।
redcalx

@ लॉस्टर को घोषणा XmlDocument(संपत्ति के रूप में) और XDocument(नोड के रूप में ) के बीच अलग-अलग संभाला जाता है । यदि आप घोषणा को संरक्षित करना चाहते हैं, तो आपको इसे स्पष्ट रूप से संभालना होगा (देखें blogs.msdn.com/b/ericwhite/archive/2010/03/03/// या @ दिमित्री का जवाब stackoverflow.com/a/8894680/2688 )
bdukes

दुर्भाग्य से यह विंडोज 10 यूडब्ल्यूपी में काम नहीं करता है। अगर किसी की दिलचस्पी है तो मैंने उस मंच के लिए अपना समाधान नीचे पोस्ट किया है।
bc3tech

28

मेरे लिए यह एकल पंक्ति समाधान बहुत अच्छी तरह से काम करता है

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

21
इसका उपयोग न करें - जबकि यह सही ढंग से काम नहीं करता है, यह बहुत ही अक्षम है क्योंकि यह पूरे एक्सएमएल पेड़ को एक ही स्ट्रिंग में परिवर्तित करता है और उसके बाद फिर से पार्स करता है।
लुसिरो

3
अलग-अलग दृष्टिकोणों के बेंचमार्क के लिए इस पोस्ट को देखें। blogs.msdn.microsoft.com/xmlteam/2009/03/31/…
बर्नार्ड वेंडर

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
इसका उपयोग न करें - जबकि यह सही ढंग से काम नहीं करता है, यह बहुत ही अक्षम है क्योंकि यह पूरे एक्सएमएल पेड़ को एक ही स्ट्रिंग में परिवर्तित करता है और उसके बाद फिर से पार्स करता है।
ल्यूकोरो

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

आप एक XmlWriter को एक XmlDocument के लिए XmlReader के लिए पाइप किए गए XmlWriter को लिखने का प्रयास कर सकते हैं।

अगर मैं अवधारणाओं को ठीक से समझता हूं, तो एक सीधा रूपांतरण संभव नहीं है (आंतरिक संरचना अलग है / एक्सडजेनमेंट के साथ सरलीकृत)। लेकिन फिर, मैं गलत हो सकता है ...



-1

यदि आपको एक विन 10 यूडब्ल्यूपी संगत संस्करण की आवश्यकता है:

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);
                }
            }
        }
    }
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.