এক্স ডকুমেন্টকে এক্সএমএল ডকুমেন্টে রূপান্তর করা এবং তদ্বিপরীত


189

এটি আমার একটি খুব সাধারণ সমস্যা। আমি এক্সএমএল ফাইল উত্পন্ন করতে এক্সডোকামেন্ট ব্যবহার করি। আমি তখন এটি এক্সএমএল ডকুমেন্ট ক্লাস হিসাবে ফিরিয়ে দিতে চাই। এবং আমার একটি এক্সএমএল ডকুমেন্ট ভেরিয়েবল রয়েছে যা আরও নোড যুক্ত করার জন্য আমাকে এক্সডোকামেন্টে ফিরে রূপান্তর করতে হবে।

সুতরাং, এক্সডোকামেন্ট এবং এক্সএমএল ডকুমেন্টের মধ্যে এক্সএমএল রূপান্তর করার সবচেয়ে কার্যকর পদ্ধতি কোনটি? (কোনও ফাইলে কোনও অস্থায়ী সঞ্চয়স্থান ব্যবহার না করে))

উত্তর:


304

আপনি বিল্ট ইন এক্স ডকুমেন্ট.ক্রেটআরিডার () এবং একটি এক্সএমএলনোডিআরডার পিছনে পিছনে রূপান্তর করতে ব্যবহার করতে পারেন।

এটির সাথে কাজ করা আরও সহজ করার জন্য এটি একটি এক্সটেনশন পদ্ধতিতে রেখে দেওয়া।

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
টেক্সএমএল ডকুমেন্ট পদ্ধতিতে তৈরি হওয়া পাঠককে নিষ্পত্তি করার বিষয়ে কি আপনাকে চিন্তা করতে হবে না?
CodeMonkey1313

5
টক্সডোকামেন্টে () কেন মুভটোকন্টে () কল করতে পারে? এটি ডানদিকের মতো দেখে মনে হচ্ছে এটি ডকুমেন্ট উপাদানটির আগে যে কোনও বিষয়বস্তু ছাড়বে, যেমন এক্সএমএল ডকের শীর্ষে কোনও মন্তব্য এবং প্রক্রিয়াকরণের নির্দেশাবলী।
redcalx

@ লকস্টার ঘোষণাটি XmlDocument(সম্পত্তি হিসাবে) এবং XDocument(নোড হিসাবে ) মধ্যে আলাদাভাবে পরিচালিত হয় । আপনি ঘোষণা সংরক্ষণ করতে চান তাহলে, আপনি এটা স্পষ্টভাবে হ্যান্ডেল করতে হবে (দেখুন blogs.msdn.com/b/ericwhite/archive/2010/03/05/... বা @ দিমিত্রি এর উত্তর stackoverflow.com/a/8894680/2688 )
বিডুকস

দুর্ভাগ্যক্রমে এটি উইন্ডোজ 10 ইউডাব্লুপি-তে কাজ করে না। কারও আগ্রহী হলে আমি নীচে সেই প্ল্যাটফর্মটির জন্য আমার সমাধান পোস্ট করেছি।
বিসি

28

আমার জন্য এই একক লাইন সমাধান খুব ভাল কাজ করে

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

21
এটি ব্যবহার করবেন না - যদিও এটি সঠিকভাবে কাজ করে, এটি খুব অকার্যকর যেহেতু এটি পুরো এক্সএমএল গাছটিকে একটি স্ট্রিংয়ে রূপান্তর করে এবং এর পরে আবার বিশ্লেষণ করে।
লুসারো


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.XmlDocument দৃষ্টান্ত মধ্যে System.Xml.Linq.XDocument দৃষ্টান্ত রূপান্তর করার প্রয়োজন হলে আপনাকে এক্সএমএল ঘোষণা হারাবেন না ফলে 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; 
        } 
    } 
}

আশা করি এইটি কাজ করবে!


4

আপনি XML ডকুমেন্টের জন্য একটি এক্সএমএমআলাইটারকে পাইপযুক্ত কোনও এক্সএমএল রাইটারে এক্সডোকামেন্ট লেখার চেষ্টা করতে পারেন।

যদি আমি ধারণাগুলি সঠিকভাবে বুঝতে পারি তবে সরাসরি রূপান্তর সম্ভব নয় (অভ্যন্তরীণ কাঠামোটি এক্সডোকামেন্টের সাহায্যে আলাদা / সরলীকৃত)। তবে, আমি ভুল হতে পারি ...



-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);
                }
            }
        }
    }
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.