এক্সএমএল স্ট্রিংকে অবজেক্টে রূপান্তর করুন


179

আমি একটি সকেটের উপর দিয়ে এক্সএমএল স্ট্রিংগুলি পাচ্ছি, এবং এগুলিকে সি # অবজেক্টে রূপান্তর করতে চাই।

বার্তা ফর্ম হয়:

<msg>
   <id>1</id>
   <action>stop</action>
</msg>

আমি নেট থেকে নতুন, এবং এটি করার জন্য সেরা অনুশীলন সম্পর্কে আমি নিশ্চিত নই। আমি জাভা এর জন্য জ্যাকএক্সবি আগেও ব্যবহার করেছি, এবং নিশ্চিত ছিলাম না এরকম কিছু আছে কিনা, বা এটি অন্যভাবে পরিচালনা করা হবে কিনা।


3
আপনার কি এইগুলি হয়ে ওঠে বা আপনি গতিশীলভাবে অবজেক্ট তৈরি করতে চান?
স্টিফান

এই পোস্টটির জন্য দেখুন: http://stackoverflow.com/questions/765422/jaxb-equivalent-in-c
আইকুট Çivik

আমার জন্য এটি সর্বোত্তম বিকল্প ছিল: stackoverflow.com/a/24184283/2647430
ইভান লোপেজ

উত্তর:


276

আপনাকে xsd.exeউইন্ডোজ এসডিকে ইনস্টল হয়ে যাওয়া এমন কোনও ডিভাইসটির অনুরূপ কোনও ডিরেক্টরিতে ব্যবহার করতে হবে:

C:\Program Files\Microsoft SDKs\Windows\v6.0A\bin

এবং -৪-বিট কম্পিউটারে:

C:\Program Files (x86)\Microsoft SDKs\Windows\v6.0A\bin

এবং উইন্ডোজ 10 কম্পিউটারে:

C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\bin

প্রথমবারে, আপনি ব্যবহার করেন xsd.exeএবং আপনি আপনার নমুনা এক্সএমএলকে একটি এক্সএসডি ফাইলে রূপান্তর করেন (এক্সএমএল স্কিমা ফাইল):

xsd yourfile.xml

এটি আপনাকে দেয় yourfile.xsdযা দ্বিতীয় ধাপে আপনি আবারও xsd.exeএকটি সি # শ্রেণিতে রূপান্তর করতে পারেন :

xsd yourfile.xsd /c

এটি আপনাকে এমন একটি ফাইল yourfile.csদেবে যাতে একটি সি # শ্রেণি থাকবে যা আপনি যে এক্সএমএল ফাইলটি পাচ্ছেন তা ডিসিরিয়ালাইজ করতে ব্যবহার করতে পারেন - এরকম কিছু:

XmlSerializer serializer = new XmlSerializer(typeof(msg));
msg resultingMessage = (msg)serializer.Deserialize(new XmlTextReader("yourfile.xml"));

বেশিরভাগ ক্ষেত্রেই বেশ ভাল কাজ করা উচিত।

আপডেট: এক্সএমএল সিরিয়ালাইজার যেকোন প্রবাহকে এর ইনপুট হিসাবে গ্রহণ করবে - ফাইল বা মেমরির স্ট্রিমটি ভাল হবে:

XmlSerializer serializer = new XmlSerializer(typeof(msg));
MemoryStream memStream = new MemoryStream(Encoding.UTF8.GetBytes(inputString));
msg resultingMessage = (msg)serializer.Deserialize(memStream);

বা স্ট্রিংরেডার ব্যবহার করুন:

XmlSerializer serializer = new XmlSerializer(typeof(msg));
StringReader rdr = new StringReader(inputString);
msg resultingMessage = (msg)serializer.Deserialize(rdr);

বিস্তারিত ব্যাখ্যার জন্য ধন্যবাদ। আমার ক্ষেত্রে, এক্সএমএল একটি সকেটের উপর দিয়ে আসছে এবং এটি একটি স্ট্রিং। আমি কীভাবে এক্সএমএল ফাইলের পরিবর্তে একটি স্ট্রিং ডি-সিরিয়ালাইজ করব?
স্টিভ

5
@ স্টিভ: আপনি একটি স্ট্রিংরিডার খুলতে এবং ডেসরিয়ালাইজ পদ্ধতিটি পাস করতে পারেন। স্ট্রিংরেডার টেক্সটরেডার থেকে প্রাপ্ত।
স্কুরমেডেল

আপনি কি লিনক ব্যবহার করে উল্লিখিত ফাহাদের সাথে আপনার দৃষ্টিভঙ্গি পছন্দ করবেন?
স্টিভ

2
@ স্টিভ: হ্যাঁ, আমি - কোনও বস্তুর ডিজিটালাইজ করা এবং বস্তুর বৈশিষ্ট্যগুলিতে ঝুঁকতে সক্ষম হওয়া এক্সএমএল উপাদান, বৈশিষ্ট্য, শিশু নোড ইত্যাদির সাথে প্রচুর ঝাঁকুনির চেয়ে অনেক সহজ মনে হয়েছে যদি লিঙ্ক-টু-এক্সএমএল দুর্দান্ত হয় এক্সএমএল অনিয়মিত এবং সমস্ত সময় পরিবর্তন হয়, বা সময়ের আগে জানা যায় না।
marc_s

7
এই ওয়েবসাইটটি এক্সএসডি সরঞ্জামের চেয়ে অনেক সহজ আইএমও: xmltocsharp.azurewebsites.net
nasch

226

আপনার দুটি সম্ভাবনা রয়েছে।

পদ্ধতি 1. এক্সএসডি সরঞ্জাম


মনে করুন এই জায়গায় আপনার এক্সএমএল ফাইল রয়েছে C:\path\to\xml\file.xml

  1. ওপেন বিকাশকারী কমান্ড প্রম্পট
    আপনি তা খুঁজে পেতে পারেন Start Menu > Programs > Microsoft Visual Studio 2012 > Visual Studio Tools অথবা আপনি যদি উইন্ডোজ 8 শুধু টাইপ করা শুরু পারেন বিকাশকারী কমান্ড প্রম্পট -এ সূচনা স্ক্রীন
  2. টাইপ করে আপনার এক্সএমএল ফাইল ডিরেক্টরিতে অবস্থান পরিবর্তন করুন cd /D "C:\path\to\xml"
  3. টাইপ করে আপনার এক্সএমএল ফাইল থেকে এক্সএসডি ফাইল তৈরি করুনxsd file.xml
  4. টাইপ করে সি # ক্লাস তৈরি করুনxsd /c file.xsd

এবং এটাই! আপনি এক্সএমএল ফাইল থেকে সি # ক্লাস তৈরি করেছেনC:\path\to\xml\file.cs

পদ্ধতি 2 - বিশেষ আটকান


প্রকল্প লক্ষ্য হিসাবে। নেট ফ্রেমওয়ার্ক> = 4.5 এর সাথে প্রয়োজনীয় ভিজ্যুয়াল স্টুডিও 2012+ এবং 'উইন্ডোজ কমিউনিকেশন ফাউন্ডেশন' স্বতন্ত্র উপাদান ইনস্টল করা হয়েছে

  1. ক্লিপবোর্ডে আপনার এক্সএমএল ফাইলের সামগ্রী অনুলিপি করুন
  2. আপনার সমাধানে নতুন, খালি ক্লাস ফাইল যুক্ত করুন ( Shift+ Alt+ C)
  3. ফাইলটি খুলুন এবং মেনু ক্লিক করুন Edit > Paste special > Paste XML As Classes
    এখানে চিত্র বর্ণনা লিখুন

এবং এটাই!

ব্যবহার


এই সহায়ক সহায়ক শ্রেণীর সাথে ব্যবহার খুব সহজ:

using System;
using System.IO;
using System.Web.Script.Serialization; // Add reference: System.Web.Extensions
using System.Xml;
using System.Xml.Serialization;

namespace Helpers
{
    internal static class ParseHelpers
    {
        private static JavaScriptSerializer json;
        private static JavaScriptSerializer JSON { get { return json ?? (json = new JavaScriptSerializer()); } }

        public static Stream ToStream(this string @this)
        {
            var stream = new MemoryStream();
            var writer = new StreamWriter(stream);
            writer.Write(@this);
            writer.Flush();
            stream.Position = 0;
            return stream;
        }


        public static T ParseXML<T>(this string @this) where T : class
        {
            var reader = XmlReader.Create(@this.Trim().ToStream(), new XmlReaderSettings() { ConformanceLevel = ConformanceLevel.Document });
            return new XmlSerializer(typeof(T)).Deserialize(reader) as T;
        }

        public static T ParseJSON<T>(this string @this) where T : class
        {
            return JSON.Deserialize<T>(@this.Trim());
        }
    }
}

আপনাকে এখন যা করতে হবে তা হ'ল:

    public class JSONRoot
    {
        public catalog catalog { get; set; }
    }
    // ...

    string xml = File.ReadAllText(@"D:\file.xml");
    var catalog1 = xml.ParseXML<catalog>();

    string json = File.ReadAllText(@"D:\file.json");
    var catalog2 = json.ParseJSON<JSONRoot>();

7
চিয়ার্স। পুনরায়: পদ্ধতি 2, আপনাকে। নেট 4.5 লক্ষ্য করতে হবে অন্যথায় বিকল্পটি উপলভ্য নয়।
টিএমবি 33

12
পদ্ধতি 2 হাস্যকরভাবে দরকারী! তার জন্য ধন্যবাদ. আমার কোন ধারণা ছিল না যা বিদ্যমান ছিল।
ডোমিনিক বিন্ডলে

1
পদ্ধতি 2 এর জন্য কুদোস, কবজির মতো কাজ করে। বোরিং ক্লাসগুলি প্রয়োগ না করে কেবল এক্সএমএল প্রোগ্রামগতভাবে পার্স করার চেষ্টা করার সময় দুর্দান্ত।
অ্যালেক্স

1
প্রথম পদ্ধতি হিসাবে আপনার "স্পষ্ট বিশেষ" তৈরি করা উচিত - এটি সবচেয়ে সহজ। সীমাবদ্ধতা "। নেট ফ্রেমওয়ার্ক> = 4.5" 2017 সালে গুরুত্বপূর্ণ নয়
মাইকেল ফ্রেইজিম

2
"ক্লাস হিসাবে এক্সএমএল আটকান" এর জন্য ভিজুয়াল স্টুডিও ইনস্টলের জন্য ডাব্লুসিএফ ওয়ার্কলোড প্রয়োজন requires
লেনার্ট

49

XML কে কোনও বস্তুতে রূপান্তর করতে এই পদ্ধতিটি ব্যবহার করে দেখুন। এটি আপনি যা করছেন ঠিক তার জন্য তৈরি করা হয়েছে:

protected T FromXml<T>(String xml)
{
    T returnedXmlClass = default(T);

    try
    {
        using (TextReader reader = new StringReader(xml))
        {
            try
            {
                returnedXmlClass = 
                    (T)new XmlSerializer(typeof(T)).Deserialize(reader);
            }
            catch (InvalidOperationException)
            {
                // String passed is not XML, simply return defaultXmlClass
            }
        }
    }
    catch (Exception ex)
    {
    }

    return returnedXmlClass ;        
}

এই কোডটি ব্যবহার করে এটি কল করুন:

YourStrongTypedEntity entity = FromXml<YourStrongTypedEntity>(YourMsgString);

6
এই ত্রুটিটি পেয়েছেন xmlns = ''> প্রত্যাশিত ছিল না "" any, কোনও ধারণা?
প্রশান্ত

সমস্যাটি হচ্ছে, আপনার ক্লাসটি আগে থেকেই নিখুঁতভাবে গঠন করা দরকার। এক্সএমএল দেওয়ার পরে কোনও ফাংশন যা ক্লাসকে আউটপুট করে? এক্সএসডি.এক্সই হিট এন্ড মিস (বেশিরভাগ জটিল স্টাফের জন্য মিস) ...
ইউমি কুইজুমি

1
ওহ godশ্বর, আমি .नेट এক্সএমএল সিরিয়ালাইজারের সাথে ডিল করার সময়গুলি কাটিয়েছি এবং এটি গেটের ঠিক বাইরে কাজ করেছে।
ক্রিস্টোফার ক্লার্ক

11

প্রশাসন হিসাবে কেবল আপনার ভিজ্যুয়াল স্টুডিও 2013 চালান ... আপনার এক্সএমএল ফাইলের বিষয়বস্তু অনুলিপি করুন .. ভিজ্যুয়াল স্টুডিও 2013 এ যান> সম্পাদনা করুন> স্পেশাল> এক্সএমএলটিকে সি # ক্লাস হিসাবে আটকান এটি আপনার এক্সএমএল ফাইলের সামগ্রী অনুযায়ী আপনার সি # ক্লাস তৈরি করবে।


7

সেক্ষেত্রে যে কেউ এই দরকারী খুঁজে পেতে পারে:

public static class XmlConvert
{
    public static string SerializeObject<T>(T dataObject)
    {
        if (dataObject == null)
        {
            return string.Empty;
        }
        try
        {
            using (StringWriter stringWriter = new System.IO.StringWriter())
            {
                var serializer = new XmlSerializer(typeof(T));
                serializer.Serialize(stringWriter, dataObject);
                return stringWriter.ToString();
            }
        }
        catch (Exception ex)
        {
            return string.Empty;
        }
    }

    public static T DeserializeObject<T>(string xml)
         where T : new()
    {
        if (string.IsNullOrEmpty(xml))
        {
            return new T();
        }
        try
        {
            using (var stringReader = new StringReader(xml))
            {
                var serializer = new XmlSerializer(typeof(T));
                return (T)serializer.Deserialize(stringReader);
            }
        }
        catch (Exception ex)
        {
            return new T();
        }
    }
}

আপনি এটি ব্যবহার করে কল করতে পারেন:

MyCustomObject myObject = new MyCustomObject();
string xmlString = XmlConvert.SerializeObject(myObject)
myObject = XmlConvert.DeserializeObject<MyCustomObject>(xmlString);

5

আপনি উপরে বর্ণিত হিসাবে ক্লাস তৈরি করতে পারেন বা ম্যানুয়ালি এগুলি লিখতে পারেন:

[XmlRoot("msg")]
public class Message
{
    [XmlElement("id")]
    public string Id { get; set; }
    [XmlElement("action")]
    public string Action { get; set; }
}

তারপরে আপনি সিরিয়ালাইজড এবং ডিসরিওলাইজ করতে এক্সটেন্ডেড এক্সএমএলসরিয়ালাইজার ব্যবহার করতে পারেন ।

Instalation আপনি থেকে ExtendedXmlSerializer ইনস্টল করতে পারেন nuget বা নিম্নলিখিত কমান্ডটি প্রয়োগ করুন:

Install-Package ExtendedXmlSerializer

ধারাবাহিকতাতে:

var serializer = new ConfigurationContainer().Create();
var obj = new Message();
var xml = serializer.Serialize(obj);

Deserialization

var obj2 = serializer.Deserialize<Message>(xml);

এই সিরিয়ালাইজার সমর্থন:

  • স্ট্যান্ডার্ড এক্সএমএলসায়ারাইজার থেকে ডিসরিয়ালেশন এক্সএমএল
  • সিরিয়ালাইজেশন ক্লাস, স্ট্রাক্ট, জেনেরিক ক্লাস, আদিম ধরণ, জেনেরিক তালিকা এবং অভিধান, অ্যারে, এনুম
  • সম্পত্তি ইন্টারফেস সহ সিরিয়ালাইজেশন ক্লাস
  • সিরিয়ালাইজেশন বিজ্ঞপ্তি রেফারেন্স এবং রেফারেন্স আইডি
  • এক্সএমএল এর পুরাতন সংস্করণটি বাতিল করা
  • সম্পত্তি এনক্রিপশন
  • কাস্টম সিরিয়ালাইজার
  • এক্সএমএলএলমেন্ট্যাট্রিবিউট এবং এক্সএমএলআরটঅ্যাট্রিবিউট সমর্থন করুন
  • পোকো - সমস্ত কনফিগারেশন (মাইগ্রেশন, কাস্টম সিরিয়ালাইজার ...) শ্রেণীর বাইরে

এক্সটেন্ডডএক্সএমএলসিরাইজার সমর্থন। নেট 4.5 বা উচ্চতর এবং। নেট কোর । আপনি এটি WebApi এবং AspCore এর সাথে সংহত করতে পারেন।


1
দুর্দান্ত পোস্ট! আমি কোডটি ডকুমেন্টেশন github.com/wojtpl2/ExtendedXMLSerializer
user1477388


2

দামিয়ানের দুর্দান্ত উত্তরটি সরলকরণ,

public static T ParseXml<T>(this string value) where T : class
{
    var xmlSerializer = new XmlSerializer(typeof(T));
    using (var textReader = new StringReader(value))
    {
        return (T) xmlSerializer.Deserialize(textReader);
    }
}

1

কাস্টমবজেক্ট হিসাবে একটি ডিটিও তৈরি করুন

জ্যাকএক্সবি ব্যবহার করে এক্সএমএল স্ট্রিংকে ডিটিওতে রূপান্তর করতে নীচের পদ্ধতিটি ব্যবহার করুন

private static CustomObject getCustomObject(final String ruleStr) {
    CustomObject customObject = null;
    try {
        JAXBContext jaxbContext = JAXBContext.newInstance(CustomObject.class);
        final StringReader reader = new StringReader(ruleStr);
        Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();
        customObject = (CustomObject) jaxbUnmarshaller.unmarshal(reader);
    } catch (JAXBException e) {
        LOGGER.info("getCustomObject parse error: ", e);
    }
    return customObject;
}

0

আপনার যদি এক্সএমএল বার্তার xsd থাকে তবে আপনি। নেট xsd.exe সরঞ্জামটি ব্যবহার করে সি # ক্লাস তৈরি করতে পারবেন।

এই। নেট ক্লাসগুলি তখন এক্সএমএল তৈরি করতে ব্যবহার করা যেতে পারে।


0

এখানে অন্য উত্তরগুলির পাশাপাশি আপনি এক্সএমএল ডকুমেন্ট শ্রেণিটি এক্সএমএল ডম-এর মতো পড়ার জন্য, বা এক্সএমএলরেডার , দ্রুত এগিয়ে কেবল পাঠক, এটি "হাতে হাতে" করতে ব্যবহার করতে পারেন।


0

সি # ক্লাস প্রজন্মের সরঞ্জামগুলির সাথে অ্যাডভান্সড এক্সএসডি সহ আর একটি উপায়: xsd2code.com। এই সরঞ্জামটি খুব কার্যকর এবং শক্তিশালী। এটি ভিজ্যুয়াল স্টুডিওর xsd.exe সরঞ্জামের চেয়ে অনেক বেশি কাস্টমাইজেশন রয়েছে। Xsd2Code ++ তালিকা বা অ্যারে ব্যবহার করতে কাস্টমাইজ করা যেতে পারে এবং প্রচুর আমদানির বিবৃতি সহ বৃহত স্কিমাকে সমর্থন করে।

কিছু বৈশিষ্ট্য দ্রষ্টব্য,

  • এক্সএসডি স্কিমা বা এক্সএমএল ফাইল থেকে নমনীয় সি # বা ভিজ্যুয়াল বেসিক কোড থেকে ব্যবসায়িক অবজেক্ট তৈরি করে।
  • সমর্থন ফ্রেমওয়ার্ক 2.0 থেকে 4.x
  • শক্তিশালী টাইপযুক্ত সংগ্রহকে সমর্থন করুন (তালিকা, পর্যবেক্ষণযোগ্য সংগ্রহ, মাই কাস্টম সংগ্রহ)।
  • সমর্থন স্বয়ংক্রিয় বৈশিষ্ট্য।
  • এক্সএমএল পঠন এবং লেখার পদ্ধতিগুলি তৈরি করুন (সিরিয়ালাইজেশন / ডিসরিয়ালাইজেশন)।
  • ডেটাবাইন্ডিং সমর্থন (ডাব্লুপিএফ, জ্যামারিন)।
  • ডাব্লুসিএফ (ডেটা মেম্বার অ্যাট্রিবিউট)।
  • এক্সএমএল এনকোডিং সমর্থন (ইউটিএফ -8 / 32, এএসসিআইআই, ইউনিকোড, কাস্টম)।
  • উটের কেস / পাস্কেল কেস সমর্থন।
  • সীমাবদ্ধতা সমর্থন ([স্ট্রিংলেন্থথ্যাট্রিবিউট = সত্য / মিথ্যা], [নিয়মিত এক্সপ্রেশনঅ্যাট্রিবিউট = সত্য / মিথ্যা], [রেঞ্জঅ্যাট্রিবিউট = সত্য / মিথ্যা])
  • বৃহত এবং জটিল এক্সএসডি ফাইল সমর্থন করুন।
  • ডটনেট কোর ও মানক সমর্থন

0

আমি জানি এই প্রশ্নটি পুরানো, তবে আমি এতে হোঁচট খেয়েছি এবং অন্য সবার চেয়ে আমার আলাদা উত্তর রয়েছে :-)

স্বাভাবিক উপায় (উপরে উল্লিখিত মন্তব্যকারীগণ হিসাবে) হ'ল একটি ক্লাস তৈরি করা এবং আপনার এক্সএমএল ডি-সিরিয়াল করা।

কিন্তু ( সতর্কতা: লজ্জাহীন স্ব-প্রচার এখানে ) আমি শুধু একটি nuget প্যাকেজ, প্রকাশিত এখানে , যার সাহায্যে আপনি করতে হবে না। আপনি কেবল যান:

string xml = System.IO.File.ReadAllText(@"C:\test\books.xml");
var book = Dandraka.XmlUtilities.XmlSlurper.ParseText(xml);

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

আপনি যদি সরাসরি dll ডাউনলোড করতে পছন্দ করেন তবে গিথুব পৃষ্ঠাটি এখানে


-7
public string Serialize<T>(T settings)
{
    XmlSerializer serializer = new XmlSerializer(typeof(T));
    StringWriter outStream = new StringWriter();
    serializer.Serialize(outStream, settings);
    return outStream.ToString();
}

5
এভাবেই কীভাবে সিরিয়ালাইজ করা যায়, কীভাবে ডিসরিয়ালাইজ করা যায় তা নয়।
alexc95

1
আপনি এখানে কোড লিখেছেন। কোনও ব্যাখ্যা ছাড়াই, এটি অনেকের কাছে অর্থহীন।
এম হাচি

কোড স্ট্রিমগুলি নিষ্পত্তি করে না
বিগফুট
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.