এক্সএমএল ডকুমেন্টকে কীভাবে ডিসরিয়ালাইজ করবেন


470

আমি কীভাবে এই এক্সএমএল ডকুমেন্টটিকে ডিসেরায়ালাইজ করব:

<?xml version="1.0" encoding="utf-8"?>
<Cars>
  <Car>
    <StockNumber>1020</StockNumber>
    <Make>Nissan</Make>
    <Model>Sentra</Model>
  </Car>
  <Car>
    <StockNumber>1010</StockNumber>
    <Make>Toyota</Make>
    <Model>Corolla</Model>
  </Car>
  <Car>
    <StockNumber>1111</StockNumber>
    <Make>Honda</Make>
    <Model>Accord</Model>
  </Car>
</Cars>

আমি এই আছে:

[Serializable()]
public class Car
{
    [System.Xml.Serialization.XmlElementAttribute("StockNumber")]
    public string StockNumber{ get; set; }

    [System.Xml.Serialization.XmlElementAttribute("Make")]
    public string Make{ get; set; }

    [System.Xml.Serialization.XmlElementAttribute("Model")]
    public string Model{ get; set; }
}

[System.Xml.Serialization.XmlRootAttribute("Cars", Namespace = "", IsNullable = false)]
public class Cars
{
    [XmlArrayItem(typeof(Car))]
    public Car[] Car { get; set; }

}

public class CarSerializer
{
    public Cars Deserialize()
    {
        Cars[] cars = null;
        string path = HttpContext.Current.ApplicationInstance.Server.MapPath("~/App_Data/") + "cars.xml";

        XmlSerializer serializer = new XmlSerializer(typeof(Cars[]));

        StreamReader reader = new StreamReader(path);
        reader.ReadToEnd();
        cars = (Cars[])serializer.Deserialize(reader);
        reader.Close();

        return cars;
    }
}

যে কাজ করে বলে মনে হচ্ছে না :-(


আমি মনে করি আপনার নমুনা ডকটিতে আপনার কোণ বন্ধনীগুলি এড়াতে হবে।
হার্পো

4
এই উত্তর সত্যিই সত্যিই ভাল stackoverflow.com/a/19613934/196210
Revious

উত্তর:


359

এখানে একটি কার্যকরী সংস্করণ। আমি XmlElementAttributeলেবেলগুলিকে পরিবর্তন করেছি XmlElementকারণ এক্সএমএলে স্টক নাম্বার, মেক এবং মডেল মানগুলি অ্যাট্রিবিউট নয়। এছাড়াও আমি অপসারণ করেছি reader.ReadToEnd();(যে ফাংশন) পুরো স্ট্রিমটি পড়ে এবং একটি স্ট্রিং দেয়, যাতে Deserialize()ফাংশনটি পাঠকটিকে আর ব্যবহার করতে পারে না ... পজিশনের স্ট্রিমের শেষে ছিল)। নামকরণের সাথে আমিও কিছু স্বাধীনতা নিয়েছি :)।

এখানে ক্লাসগুলি রয়েছে:

[Serializable()]
public class Car
{
    [System.Xml.Serialization.XmlElement("StockNumber")]
    public string StockNumber { get; set; }

    [System.Xml.Serialization.XmlElement("Make")]
    public string Make { get; set; }

    [System.Xml.Serialization.XmlElement("Model")]
    public string Model { get; set; }
}


[Serializable()]
[System.Xml.Serialization.XmlRoot("CarCollection")]
public class CarCollection
{
    [XmlArray("Cars")]
    [XmlArrayItem("Car", typeof(Car))]
    public Car[] Car { get; set; }
}

ডিসরিয়ালাইজ ফাংশন:

CarCollection cars = null;
string path = "cars.xml";

XmlSerializer serializer = new XmlSerializer(typeof(CarCollection));

StreamReader reader = new StreamReader(path);
cars = (CarCollection)serializer.Deserialize(reader);
reader.Close();

এবং সামান্য টুইটযুক্ত এক্সএমএল (<গাড়ি> মোড়ানোর জন্য আমার একটি নতুন উপাদান যুক্ত করা দরকার ছিল ... নেট ডিজাইজাইজিং অ্যারে সম্পর্কে নেট পিক):

<?xml version="1.0" encoding="utf-8"?>
<CarCollection>
<Cars>
  <Car>
    <StockNumber>1020</StockNumber>
    <Make>Nissan</Make>
    <Model>Sentra</Model>
  </Car>
  <Car>
    <StockNumber>1010</StockNumber>
    <Make>Toyota</Make>
    <Model>Corolla</Model>
  </Car>
  <Car>
    <StockNumber>1111</StockNumber>
    <Make>Honda</Make>
    <Model>Accord</Model>
  </Car>
</Cars>
</CarCollection>

67
[Serializable]অপ্রয়োজনীয় ব্যবহার যদি XmlSerializer; XmlSerializerকেবল কখনও এটির জন্য পরীক্ষা করে না। তেমনি, বেশিরভাগ [Xml...]বৈশিষ্ট্যগুলি অনর্থক, কারণ এটি কেবল ডিফল্ট আচরণের নকল করে; উদাহরণস্বরূপ, পূর্বনির্ধারিত কোনও সম্পত্তি নামের StockNumberউপাদান হিসাবে সংরক্ষণ করা হয় <StockNumber>- এর জন্য বৈশিষ্ট্যের কোনও প্রয়োজন নেই।
মার্ক Gravell

3
উল্লেখ্য যে এক্সএমএলএলমেন্টএট্রিবিউট = এক্সএমএলএলিমেন্ট (এটি এমন একটি ভাষা বৈশিষ্ট্য যা আপনি "অ্যাট্রিবিউট" প্রত্যয়টি বাদ দিতে পারেন) এখানে আসল সমাধানটি হ'ল রিডটোইন্ড () কলটি সরিয়ে নেওয়া এবং একটি রুট নোড যুক্ত করা। তবে এরিমস্কি থেকে কোডটি আরও ভালভাবে ব্যবহার করুন যা প্রশ্নের সমাধান করে (প্রদত্ত এক্সএমএলটি পার্স করুন)
ফ্লেমফায়ার

2
ধন্যবাদ কেভিন, তবে আমি যদি নমুনা এক্সএমএল থেকে কারসক্লেশনটি সরিয়ে রাখি। আমি ক্লাস থেকে কারস্কোলিকেশন সরিয়েছি এবং কোডটি ডিজেরালাইজ করেছিলাম, তবে সফল হই নি।
বিক্রান্ত

441

আপনি কীভাবে কেবল একটি ফাইলের মধ্যে এক্সএমএল সংরক্ষণ করবেন এবং সি # ক্লাস তৈরি করতে এক্সএসডি ব্যবহার করবেন ?

  1. ডিস্কে ফাইলটি লিখুন (আমি এর নাম দিয়েছি foo.xML)
  2. এক্সএসডি উত্পন্ন করুন: xsd foo.xml
  3. সি # তৈরি করুন: xsd foo.xsd /classes

এবং ভয়েলা - এবং সি # কোড ফাইল যা এর মাধ্যমে ডেটা পড়তে সক্ষম হবে XmlSerializer:

    XmlSerializer ser = new XmlSerializer(typeof(Cars));
    Cars cars;
    using (XmlReader reader = XmlReader.Create(path))
    {
        cars = (Cars) ser.Deserialize(reader);
    }

(প্রকল্পে উত্পন্ন foo.cs অন্তর্ভুক্ত করুন)


6
তুমি আসল পুরুষ! ধন্যবাদ। যার যার প্রয়োজন এটির জন্য, "পথ" একটি স্ট্রিম হতে পারে যা আপনি ওয়েব প্রতিক্রিয়া থেকে এমনভাবে তৈরি করেছেন: var রেফারেন্স = প্রতিক্রিয়া on var প্রবাহ = নতুন মেমরিস্ট্রিম (resp.Result);
সিন্ধুস্টার

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


2
xsd.exe ভিজ্যুয়াল স্টুডিও কমান্ড প্রম্পট থেকে উপলব্ধ, উইন্ডোজ কমান্ড প্রম্পট নয়। আপনি সরঞ্জামগুলির অধীনে ভিজ্যুয়াল স্টুডিওর মধ্যে থেকে কমান্ড প্রম্পটটি খুলতে পারেন কিনা তা দেখুন। যদি তা না হয় তবে ভিজ্যুয়াল স্টুডিও ফোল্ডার থেকে এটি অ্যাক্সেস করার চেষ্টা করুন। ভিএস 2012 এর জন্য এটি এখানে অবস্থিত: সি: \ প্রোগ্রাম ফাইলগুলি (x86) \ মাইক্রোসফ্ট ভিজ্যুয়াল স্টুডিও 12.0 \ কমন 7 \ সরঞ্জামগুলি \ শর্টকাট। উইন্ডোজ 8 এ "ভিজ্যুয়াল স্টুডিও সরঞ্জাম" অনুসন্ধান করার চেষ্টা করুন।
goku_da_master

2
এক্সএসডি খুঁজছেন এমন প্রত্যেকের জন্য। : এখানে একটি তাই থ্রেড এর stackoverflow.com/questions/22975031/...
SOReader

229

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

পদ্ধতি 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 - বিশেষ আটকান


প্রয়োজনীয় ভিজ্যুয়াল স্টুডিও 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>();

16
+1 ভাল উত্তর। তবে, Paste XML As Classesকমান্ডটি কেবলমাত্র টার্গেট করেছে। নেট 4.5
রেভি অ্যামিরি

1
আপনার যদি vs2012 + ইনস্টল করা থাকে তবে এটি মডেলটি উত্পন্ন করার একটি দুর্দান্ত উপায়। স্বয়ংক্রিয় বৈশিষ্ট্যগুলি ব্যবহার করার জন্য আমি পুনঃশ্যাপার কোড ক্লিনআপটি চালিয়েছি এবং তারপরে পাশাপাশি আরও কিছু পরিশ্রমও করেছি। আপনি এই পদ্ধতির মাধ্যমে উত্পন্ন করতে পারেন এবং তারপরে যদি প্রয়োজন হয় তবে কোনও পুরানো প্রকল্পে অনুলিপি করতে পারেন।
স্কটি ডট নেট

4
.Net4.5 লক্ষ্য করা কোনও সমস্যা নয়। ডটনেট ৪.৫ দিয়ে কেবল একটি অস্থায়ী প্রকল্প শুরু করুন, সেখানে আপনার অনুলিপিটি করুন এবং আপনার আসল প্রকল্পে উত্সটি অনুলিপি করুন।
লসমানোস

2
"ক্যাটালগ" অবজেক্ট বা ক্লাসটি কোথায়?
সিবি 4

3
ভিএস 2017 সম্প্রদায়ে সেই মেনুতে প্রদর্শন করতে "ক্লাস হিসাবে এক্সএমএল আটকান" এর জন্য আপনার "এএসপি.এনইটি এবং ওয়েব বিকাশ" ইনস্টল করা দরকার। যদি অনুপস্থিত থাকে তবে আপনার ইনস্টলেশনটি সংশোধন করতে আবার ভিএস ইনস্টলারটি চালান।
স্লিয়ন

89

নিম্নলিখিত স্নিপেটটি কৌতুকটি করা উচিত (এবং আপনি সিরিয়ালের বেশিরভাগ বৈশিষ্ট্য উপেক্ষা করতে পারেন):

public class Car
{
  public string StockNumber { get; set; }
  public string Make { get; set; }
  public string Model { get; set; }
}

[XmlRootAttribute("Cars")]
public class CarCollection
{
  [XmlElement("Car")]
  public Car[] Cars { get; set; }
}

...

using (TextReader reader = new StreamReader(path))
{
  XmlSerializer serializer = new XmlSerializer(typeof(CarCollection));
  return (CarCollection) serializer.Deserialize(reader);
}

14
এটি আসলে এক এবং একমাত্র উত্তর। গৃহীত উত্তরের কয়েকটি দোষ রয়েছে যা প্রাথমিকভাবে বিভ্রান্ত করতে পারে।
শিখা আগুন

24

এটি সাহায্য করে কিনা দেখুন:

[Serializable()]
[System.Xml.Serialization.XmlRootAttribute("Cars", Namespace = "", IsNullable = false)]
public class Cars
{
    [XmlArrayItem(typeof(Car))]
    public Car[] Car { get; set; }
}

[Serializable()]
public class Car
{
    [System.Xml.Serialization.XmlElement()]
    public string StockNumber{ get; set; }

    [System.Xml.Serialization.XmlElement()]
    public string Make{ get; set; }

    [System.Xml.Serialization.XmlElement()]
    public string Model{ get; set; }
}

এবং ব্যর্থ হ'ল সেই এক্সএমএল ফাইলের উপর ভিত্তি করে স্কিমা ডকুমেন্ট তৈরি করতে ভিজ্যুয়াল স্টুডিওতে আসা xsd.exe প্রোগ্রামটি ব্যবহার করুন এবং তারপরে স্কিমা নথির উপর ভিত্তি করে একটি শ্রেণি তৈরি করতে এটি আবার ব্যবহার করুন।


9

আমি মনে করি না। নেট 'অ্যারেজাইজেশন অ্যারে সম্পর্কে সেরা'। প্রথম এক্সএমএল ডকুমেন্টটি ভালভাবে তৈরি হয়নি। কোনও মূল উপাদান নেই, যদিও দেখে মনে হচ্ছে এটি রয়েছে। ক্যানোনিকাল এক্সএমএল ডকুমেন্টের মূল এবং কমপক্ষে 1 টি উপাদান রয়েছে (যদি তা হয়)। আপনার উদাহরণে:

<Root> <-- well, the root
  <Cars> <-- an element (not a root), it being an array
    <Car> <-- an element, it being an array item
    ...
    </Car>
  </Cars>
</Root>

7

আপনার .xML ফাইলটি ডিস্কের কোথাও তৈরি হয়েছে এবং যদি আপনি ব্যবহার করেছেন List<T>: কোডের এই ব্লকটি ব্যবহার করে দেখুন

//deserialization

XmlSerializer xmlser = new XmlSerializer(typeof(List<Item>));
StreamReader srdr = new StreamReader(@"C:\serialize.xml");
List<Item> p = (List<Item>)xmlser.Deserialize(srdr);
srdr.Close();`

দ্রষ্টব্য: C:\serialize.xmlআমার .xML ফাইলের পথ। আপনি আপনার প্রয়োজনের জন্য এটি পরিবর্তন করতে পারেন।


6

কেভিনের আনসার ভাল, সত্যটি বাদ দিয়ে, সত্য যে বিশ্বে আপনি প্রায়শই আপনার প্রয়োজন অনুসারে মূল এক্সএমএল পরিবর্তন করতে সক্ষম হন না।

মূল এক্সএমএলের জন্য একটি সহজ সমাধানও রয়েছে:

[XmlRoot("Cars")]
public class XmlData
{
    [XmlElement("Car")]
    public List<Car> Cars{ get; set; }
}

public class Car
{
    public string StockNumber { get; set; }
    public string Make { get; set; }
    public string Model { get; set; }
}

এবং তারপরে আপনি কেবল কল করতে পারেন:

var ser = new XmlSerializer(typeof(XmlData));
XmlData data = (XmlData)ser.Deserialize(XmlReader.Create(PathToCarsXml));

ধন্যবাদ! আপনার উত্তরটি হ'ল আমার যা প্রয়োজন তা হ'ল আমি গিগা বাইটের মূল্যবান লগ ফাইলগুলিকে পরিবর্তন করতে চাইনি।
কলিন

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

5

এক্সএমএল সিরিয়ালাইজেশন এবং ডেসারিয়ালাইজেশনের জন্য এই জেনেরিক ক্লাসটি ব্যবহার করে দেখুন।

public class SerializeConfig<T> where T : class
{
    public static void Serialize(string path, T type)
    {
        var serializer = new XmlSerializer(type.GetType());
        using (var writer = new FileStream(path, FileMode.Create))
        {
            serializer.Serialize(writer, type);
        }
    }

    public static T DeSerialize(string path)
    {
        T type;
        var serializer = new XmlSerializer(typeof(T));
        using (var reader = XmlReader.Create(path))
        {
            type = serializer.Deserialize(reader) as T;
        }
        return type;
    }
}

4

নতুনদের জন্য

আমি উত্তরগুলি এখানে খুব সহায়ক বলে খুঁজে পেয়েছি, যা বলেছে যে এই কাজটি পেতে আমি এখনও লড়াই করেছি (কিছুটা)। সুতরাং, যদি এটি কাউকে সহায়তা করে তবে আমি কার্যক্ষম সমাধানটি বানান:

মূল প্রশ্ন থেকে এক্সএমএল। এক্সএমএল একটি ফাইল Class1.xML এ রয়েছে, pathএই ফাইলটিতে একটি এই এক্সএমএল ফাইলটি সনাক্ত করতে কোডে ব্যবহৃত হয়।

আমি এই কাজটি পেতে উত্তরটির উত্তর দিয়েছি, সুতরাং Car.cs নামে একটি ফাইল তৈরি করে নিম্নলিখিতটি যুক্ত করেছি:

using System.Xml.Serialization;  // Added

public class Car
{
    public string StockNumber { get; set; }
    public string Make { get; set; }
    public string Model { get; set; }
}

[XmlRootAttribute("Cars")]
public class CarCollection
{
    [XmlElement("Car")]
    public Car[] Cars { get; set; }
}

অন্যান্য বিট কোড দেওয়া হয়েছে ইরামস্কি দ্বারা ...

using (TextReader reader = new StreamReader(path))
{
  XmlSerializer serializer = new XmlSerializer(typeof(CarCollection));
  return (CarCollection) serializer.Deserialize(reader);
}

... আপনার মূল প্রোগ্রামে চলে যায় (প্রোগ্রাম.সি), এর static CarCollection XCar()মতো:

using System;
using System.IO;
using System.Xml.Serialization;

namespace ConsoleApp2
{
    class Program
    {

        public static void Main()
        {
            var c = new CarCollection();

            c = XCar();

            foreach (var k in c.Cars)
            {
                Console.WriteLine(k.Make + " " + k.Model + " " + k.StockNumber);
            }
            c = null;
            Console.ReadLine();

        }
        static CarCollection XCar()
        {
            using (TextReader reader = new StreamReader(@"C:\Users\SlowLearner\source\repos\ConsoleApp2\ConsoleApp2\Class1.xml"))
            {
                XmlSerializer serializer = new XmlSerializer(typeof(CarCollection));
                return (CarCollection)serializer.Deserialize(reader);
            }
        }
    }
}

আশা করি এটা সাহায্য করবে :-)


1
এটা আমার জন্য কাজ করেছে। এটি প্রদত্ত এক্সএমএল ইনপুট (ওপির উদাহরণ হিসাবে) এর জন্যও পুরোপুরি কার্যকর সমাধান। [এক্সএমএলমেন্ট ("গাড়ি")] হ'ল সঠিক বৈশিষ্ট্য। অন্যান্য উদাহরণে তারা এক্সএমএলআরে ইত্যাদি ব্যবহার করেছেন যা যতক্ষণ না আমাদের কাছে সার্বজনীন কার হিসাবে বর্ণনা করা সম্পত্তি রয়েছে [গাড়ি] পাওয়া যায়; সেট; } এবং এটি এটি সঠিকভাবে ডিসরিয়ালাইজ করবে। ধন্যবাদ।
দিবাকর পদ্মরাজা

3

কোনও এক্সএমএল ডকুমেন্টকে ডিসেরায়ালাইজ করার জন্য জেনেরিক শ্রেণি সম্পর্কে কীভাবে

//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// Generic class to load any xml into a class
// used like this ...
// YourClassTypeHere InfoList = LoadXMLFileIntoClass<YourClassTypeHere>(xmlFile);

using System.IO;
using System.Xml.Serialization;

public static T LoadXMLFileIntoClass<T>(string xmlFile)
{
    T returnThis;
    XmlSerializer serializer = new XmlSerializer(typeof(T));
    if (!FileAndIO.FileExists(xmlFile))
    {
        Console.WriteLine("FileDoesNotExistError {0}", xmlFile);
    }
    returnThis = (T)serializer.Deserialize(new StreamReader(xmlFile));
    return (T)returnThis;
}

এই অংশটি প্রয়োজন হতে পারে বা নাও হতে পারে। এক্সএমএল ডকুমেন্টটি ভিজ্যুয়াল স্টুডিওতে খুলুন, এক্সএমএলে ডান ক্লিক করুন, বৈশিষ্ট্য চয়ন করুন। তারপরে আপনার স্কিমা ফাইলটি চয়ন করুন।


1
এটি আমাকে ব্যবসায়ের লজিক কোডটি বেশ কিছুটা সঙ্কুচিত করতে এবং আমার দ্বারা উত্পাদিত সমস্ত <T> ক্লাসগুলির সাহায্যকারী শ্রেণিতে কার্যকারিতা কেন্দ্রীয় করে তোলার অনুমতি দেয়। আমার কাছে ইতিমধ্যে একটি স্ট্রিংতে এক্সএমএল ছিল, সুতরাং এটি এটি ঘনীভূত করতে পারে: `সার্বজনীন স্ট্যাটিক টি লোডএক্সএমএলফিলইন্টক্লাস <টি> (স্ট্রিং এক্সএমএলডাটা) {ml ml এক্সএমএলসিরিয়াল সিরিয়ালাইজার = নতুন এক্সএমএল সিরিয়ালাইজার (টাইপফ (টি)); `রিটার্ন (টি) সিরিয়ালাইজার.ডিজারালাইজ (নতুন স্ট্রিংরিডার (এক্সএমএলডাটা)); }} ধন্যবাদ!
pwrgreg007


2

Deserialization জন্য সমস্ত স্তরের পরিচালনা করা হচ্ছে ধারণাটি দয়া করে একটি নমুনা সমাধান দেখুন যা আমার অনুরূপ সমস্যা সমাধান করেছে

<?xml version="1.0" ?> 
 <TRANSACTION_RESPONSE>
    <TRANSACTION>
        <TRANSACTION_ID>25429</TRANSACTION_ID> 
        <MERCHANT_ACC_NO>02700701354375000964</MERCHANT_ACC_NO> 
        <TXN_STATUS>F</TXN_STATUS> 
        <TXN_SIGNATURE>a16af68d4c3e2280e44bd7c2c23f2af6cb1f0e5a28c266ea741608e72b1a5e4224da5b975909cc43c53b6c0f7f1bbf0820269caa3e350dd1812484edc499b279</TXN_SIGNATURE> 
        <TXN_SIGNATURE2>B1684258EA112C8B5BA51F73CDA9864D1BB98E04F5A78B67A3E539BEF96CCF4D16CFF6B9E04818B50E855E0783BB075309D112CA596BDC49F9738C4BF3AA1FB4</TXN_SIGNATURE2> 
        <TRAN_DATE>29-09-2015 07:36:59</TRAN_DATE> 
        <MERCHANT_TRANID>150929093703RUDZMX4</MERCHANT_TRANID> 
        <RESPONSE_CODE>9967</RESPONSE_CODE> 
        <RESPONSE_DESC>Bank rejected transaction!</RESPONSE_DESC> 
        <CUSTOMER_ID>RUDZMX</CUSTOMER_ID> 
        <AUTH_ID /> 
        <AUTH_DATE /> 
        <CAPTURE_DATE /> 
        <SALES_DATE /> 
        <VOID_REV_DATE /> 
        <REFUND_DATE /> 
        <REFUND_AMOUNT>0.00</REFUND_AMOUNT> 
    </TRANSACTION>
  </TRANSACTION_RESPONSE> 

উপরের এক্সএমএল দুটি স্তরে পরিচালনা করা হয়

  [XmlType("TRANSACTION_RESPONSE")]
public class TransactionResponse
{
    [XmlElement("TRANSACTION")]
    public BankQueryResponse Response { get; set; }

}

অভ্যন্তরীণ স্তর

public class BankQueryResponse
{
    [XmlElement("TRANSACTION_ID")]
    public string TransactionId { get; set; }

    [XmlElement("MERCHANT_ACC_NO")]
    public string MerchantAccNo { get; set; }

    [XmlElement("TXN_SIGNATURE")]
    public string TxnSignature { get; set; }

    [XmlElement("TRAN_DATE")]
    public DateTime TranDate { get; set; }

    [XmlElement("TXN_STATUS")]
    public string TxnStatus { get; set; }


    [XmlElement("REFUND_DATE")]
    public DateTime RefundDate { get; set; }

    [XmlElement("RESPONSE_CODE")]
    public string ResponseCode { get; set; }


    [XmlElement("RESPONSE_DESC")]
    public string ResponseDesc { get; set; }

    [XmlAttribute("MERCHANT_TRANID")]
    public string MerchantTranId { get; set; }

}

একাধিক স্তরের আপনার একাধিক স্তরের প্রয়োজন car as array মাল্টিলেভাল ডিসেরিয়ালাইজেশনের জন্য এই উদাহরণটি দেখুন


1

আপনি যদি আপনার এক্সএসডি ফাইল তৈরি করতে xsd.exe ব্যবহার করে ত্রুটি পেয়ে থাকেন তবে এমএসডিএন- তে উল্লিখিত হিসাবে এক্সএমএলশেমিএফেন্স ক্লাসটি ব্যবহার করুন । এখানে প্রদর্শনের জন্য একটি ইউনিট পরীক্ষা রয়েছে:

using System.Xml;
using System.Xml.Schema;

[TestMethod]
public void GenerateXsdFromXmlTest()
{
    string folder = @"C:\mydir\mydata\xmlToCSharp";
    XmlReader reader = XmlReader.Create(folder + "\some_xml.xml");
    XmlSchemaSet schemaSet = new XmlSchemaSet();
    XmlSchemaInference schema = new XmlSchemaInference();

    schemaSet = schema.InferSchema(reader);


    foreach (XmlSchema s in schemaSet.Schemas())
    {
        XmlWriter xsdFile = new XmlTextWriter(folder + "\some_xsd.xsd", System.Text.Encoding.UTF8);
        s.Write(xsdFile);
        xsdFile.Close();
    }
}

// now from the visual studio command line type: xsd some_xsd.xsd /classes

1

আপনি কেবলমাত্র আপনার জন্য একটি গাড়ি বৈশিষ্ট্য XMLArrayItem থেকে XMLElment এ পরিবর্তন করতে পারেন। যে, থেকে

[System.Xml.Serialization.XmlRootAttribute("Cars", Namespace = "", IsNullable = false)]
public class Cars
{
    [XmlArrayItem(typeof(Car))]
    public Car[] Car { get; set; }
}

প্রতি

[System.Xml.Serialization.XmlRootAttribute("Cars", Namespace = "", IsNullable = false)]
public class Cars
{
    [XmlElement("Car")]
    public Car[] Car { get; set; }
}

1

আমার সমাধান:

  1. ব্যবহার Edit > Past Special > Paste XML As Classesআপনার কোডে ক্লাস পেতে
  2. এর মতো কিছু চেষ্টা করুন: that শ্রেণির একটি তালিকা তৈরি করুন ( List<class1>), তারপরে XmlSerializerসেই তালিকাটিকে ক্রমিকায়িত করতে একটি ব্যবহার করুনxml ফাইলে করুন।
  3. এখন আপনি কেবল আপনার ডেটা দিয়ে সেই ফাইলের বডি প্রতিস্থাপন করুন এবং deserializeএটি চেষ্টা করুন ।

কোড:

StreamReader sr = new StreamReader(@"C:\Users\duongngh\Desktop\Newfolder\abc.txt");
XmlSerializer xml = new XmlSerializer(typeof(Class1[]));
var a = xml.Deserialize(sr);
sr.Close();

দ্রষ্টব্য: আপনাকে অবশ্যই মূল নামটিতে মনোযোগ দিতে হবে, এটি পরিবর্তন করবেন না। খনিটি "অ্যারেঅফ ক্লাস 1"


1
async public static Task<JObject> XMLtoNETAsync(XmlDocument ToConvert)
{
    //Van XML naar JSON
    string jsonText = await Task.Run(() => JsonConvert.SerializeXmlNode(ToConvert));

    //Van JSON naar .net object
    var o = await Task.Run(() => JObject.Parse(jsonText));

    return o;
}

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