XML डॉक्यूमेंट को डिसेर्बलाइज कैसे करें


470

मैं इस XML दस्तावेज़ का वर्णन कैसे करूँ:

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

यह काम नहीं लगता है :-(


मुझे लगता है कि आपको अपने नमूना डॉक्टर में कोण कोष्ठक से बचने की आवश्यकता है।
21

4
यह उत्तर वास्तव में बहुत अच्छा है: stackoverflow.com/a/19613934/196210
जाहिर है

जवाबों:


359

यहाँ एक कार्यशील संस्करण है। मैंने XmlElementAttributeलेबल को बदल दिया XmlElementक्योंकि xml में स्टॉकनंबर, मेक और मॉडल मान तत्व हैं, गुण नहीं। इसके अलावा मैंने इसे हटा दिया 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; }
}

Deserialize फ़ंक्शन:

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

और थोड़ा tweaked xml (मैं एक नया तत्व जोड़ने के लिए <कार> को जोड़ने की जरूरत है ... नेट deserializing गिरफ्तारी के बारे में picky है):

<?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
ध्यान दें कि XmlElementAttribute = XmlElement (यह एक भाषा की विशेषता है कि आप प्रत्यय "गुण" को छोड़ सकते हैं) यहां वास्तविक समाधान ReadToEnd () कॉल को हटाने और रूट नोड को जोड़ने का है। लेकिन बेहतर erymski से कोड का उपयोग करें जो प्रश्न हल करता है (दिए गए xml को पार्स करें)
Flamefire

2
धन्यवाद केविन, लेकिन क्या होगा अगर मैंने नमूना XML से CarsCollection को हटा दिया। मैंने क्लासरूम से क्लासरूम को हटा दिया और कोड डीज़ेरलाइज़ कर दिया, लेकिन सफल नहीं हुआ।
विक्रांत

441

कैसे के बारे में आप बस एक फ़ाइल को xml सहेजें, और सी # कक्षाएं उत्पन्न करने के लिए xsd का उपयोग करें ?

  1. डिस्क पर फ़ाइल लिखें (मैंने इसे foo.xml नाम दिया है)
  2. Xsd उत्पन्न करें: xsd foo.xml
  3. सी # उत्पन्न करें: xsd foo.xsd /classes

Et voila - और C # कोड फ़ाइल जिसे डेटा को पढ़ने में सक्षम होना चाहिए XmlSerializer:

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

(परियोजना में उत्पन्न foo.cs शामिल करें)


6
तुम आदमी हो! धन्यवाद। किसी को भी इसकी आवश्यकता है, "पथ" एक स्ट्रीम हो सकता है जिसे आप वेब प्रतिक्रिया से बनाते हैं जैसे: var resp = response.Content.ReadAsByteArrayAsync (); var stream = new MemoryStream (resp.Result);
इंधस्टर

1
बहुत बढ़िया विचार है, लेकिन यह मेरे थोड़े अधिक जटिल मॉडल के लिए सही काम करने के लिए नहीं मिल सका है। मुझे नेस्टेड एरेज़ के लिए टाइप कन्वर्ज़न एरर्स मिलते रहे - प्लस नेमिंग स्कीम से वांछित होने के लिए कुछ बचा। इसलिए मैंने कस्टम मार्ग पर जाकर समाप्त किया।
GotDibbs

9
कैसे करें xsd.exe
jwillmer

2
xsd.exe विजुअल स्टूडियो कमांड प्रॉम्प्ट से उपलब्ध है, विंडोज़ कमांड प्रॉम्प्ट से नहीं। देखें कि क्या आप उपकरण के अंतर्गत दृश्य स्टूडियो के भीतर से कमांड प्रॉम्प्ट खोल सकते हैं। यदि नहीं, तो इसे दृश्य स्टूडियो फ़ोल्डर से एक्सेस करने का प्रयास करें। VS 2012 के लिए यह यहाँ स्थित था: C: \ Program Files (x86) \ Microsoft Visual Studio 12.0 \ Common7 \ Tools \ Shortcuts। विंडोज 8 में "विजुअल स्टूडियो टूल्स" की खोज करने की कोशिश करें।
गोकू_डा_मास्टर १६'१४

2
जो हर कोई XSD की तलाश में है। यहाँ एक SO थ्रेड है: stackoverflow.com/questions/22975031/…
SOReader

229

आपके पास दो संभावनाएँ हैं।

विधि 1. XSD उपकरण


मान लीजिए कि आपके पास इस स्थान पर अपनी XML फ़ाइल है C:\path\to\xml\file.xml

  1. ओपन डेवलपर कमांड प्रॉम्प्ट
    आप इसे पा सकते हैं Start Menu > Programs > Microsoft Visual Studio 2012 > Visual Studio Tools या अगर आपके पास विंडोज 8 है तो स्टार्ट स्क्रीन में डेवलपर कमांड प्रॉम्प्ट टाइप करना शुरू कर सकते हैं
  2. टाइप करके अपनी XML फ़ाइल निर्देशिका में स्थान बदलें cd /D "C:\path\to\xml"
  3. टाइप करके अपनी Xml फाइल से XSD फाइल बनाएंxsd file.xml
  4. टाइप करके C # क्लास बनाएंxsd /c file.xsd

और बस! आपने xml फ़ाइल से C # कक्षाएं उत्पन्न की हैंC:\path\to\xml\file.cs

विधि 2 - विशेष पेस्ट करें


आवश्यक विज़ुअल स्टूडियो 2012+

  1. अपने XML फ़ाइल की सामग्री को क्लिपबोर्ड पर कॉपी करें
  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कमांड केवल .NET 4.5 को लक्षित करता है
ravy amiry

1
यदि आप vs2012 + स्थापित करते हैं तो यह मॉडल उत्पन्न करने का एक शानदार तरीका है। मैंने स्वचालित गुणों का उपयोग करने के लिए बाद में ReSharper कोड क्लीनअप चलाया और फिर कुछ अन्य तरीके से भी काम किया। आप इस विधि के माध्यम से उत्पन्न कर सकते हैं और फिर जरूरत पड़ने पर पुराने प्रोज में कॉपी कर सकते हैं।
स्कॉट्टी .नेट

4
लक्ष्यीकरण .net4.5 कोई समस्या नहीं है। बस dotnet4.5 के साथ एक अस्थायी परियोजना को फायर करें, अपनी कॉपी-पेस्ट वहां करें और स्रोत को अपने वास्तविक प्रोजेक्ट पर कॉपी करें।
लॉसमनोस

2
"कैटलॉग" ऑब्जेक्ट या क्लास कहाँ है?
CB4

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

और उस xml फ़ाइल के आधार पर एक स्कीमा दस्तावेज़ बनाने के लिए विज़ुअल स्टूडियो के साथ आने वाले xsd.exe प्रोग्राम का उपयोग करने में विफल रहता है, और फिर स्कीमा दस्तावेज़ के आधार पर एक वर्ग बनाने के लिए फिर से इसका उपयोग करता है।


9

मुझे नहीं लगता है कि .net 'असाध्य सरणियों के बारे में अचार है'। पहला xml दस्तावेज़ अच्छी तरह से नहीं बना है। कोई मूल तत्व नहीं है, हालांकि ऐसा लगता है कि वहाँ है। विहित एक्सएमएल दस्तावेज़ में एक रूट और कम से कम 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

इस तथ्य से अलग केविन का ऐसर अच्छा है, कि वास्तविक दुनिया में, आप अक्सर अपनी आवश्यकताओं के अनुरूप मूल XML को बदलने में सक्षम नहीं होते हैं।

मूल XML के लिए एक सरल समाधान भी है:

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

धन्यवाद! आपका उत्तर ठीक वैसा ही है जैसा मुझे चाहिए था, क्योंकि मैं लॉग फाइल के लिए गीगाबाइट को बदलना नहीं चाहता था।
कॉलिन

हालांकि यह ध्यान देने योग्य है कि XmlSerializer समाधान बहुत ही सुरुचिपूर्ण है, लेकिन माना जाता है कि यह बहुत तेज़ नहीं है और अप्रत्याशित रूप से Xml डेटा के प्रति संवेदनशील है। इसलिए यदि आपकी समस्या को पूरी तरह से निराकरण की आवश्यकता नहीं है, तो आपको अधिक व्यावहारिक और प्रदर्शनकारी XmlReader वर्ग का उपयोग करने पर विचार करना चाहिए और <कार> तत्वों के माध्यम से लूप करना चाहिए।
किम होमन

5

Xml Serialization & Deserialization के लिए इस सामान्य वर्ग का प्रयास करें।

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

नौसिखिये के लिए

मुझे यहाँ उत्तर बहुत मददगार लगे, कहा कि मैंने अभी भी इस काम को करने के लिए संघर्ष किया (बस थोड़ा सा)। तो, अगर यह किसी को मदद करता है तो मैं काम करने का हल निकालूंगा:

मूल प्रश्न से एक्सएमएल। Xml एक फ़ाइल Class1.xml में है, pathइस फ़ाइल के लिए कोड में इस xml फ़ाइल का पता लगाने के लिए उपयोग किया जाता है।

मैंने इस कार्य को प्राप्त करने के लिए @erymski द्वारा उत्तर का उपयोग किया, इसलिए 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; }
}

@Erymski द्वारा प्रदान किया गया कोड का दूसरा भाग ...

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

... static CarCollection XCar()इस तरह से आपके मुख्य कार्यक्रम (Program.cs) में जाता है:

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
इसने मेरे लिए काम किया। यह दिए गए xml इनपुट (ओपी के उदाहरण के अनुसार) के लिए पूरी तरह से काम कर रहा समाधान है। [XmlElement ("कार")] सही विशेषता है। अन्य उदाहरणों में उन्होंने XmlArray आदि का उपयोग किया, जिनकी तब तक आवश्यकता नहीं है जब तक हमारे पास सार्वजनिक कार के रूप में परिभाषित संपत्ति है [कारें]; सेट; } और यह सही ढंग से deserialize होगा। धन्यवाद।
दिवाकर पद्मराजा

3

XML डॉक्यूमेंट को डिसेर्बलाइज करने के लिए एक सामान्य वर्ग के बारे में कैसे

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

यह हिस्सा आवश्यक नहीं है, या हो सकता है। Visual Studio में XML डॉक्यूमेंट खोलें, XML पर राइट क्लिक करें, गुण चुनें। फिर अपनी स्कीमा फ़ाइल चुनें।


1
इसने मुझे व्यापार तर्क कोड को काफी कम करने और एक सहायक वर्ग में कार्यक्षमता को केंद्रीकृत करने की अनुमति दी, जो कि मैंने उत्पन्न सभी <T> वर्गों के साथ किया था। मेरे पास पहले से ही XML एक स्ट्रिंग में था, इसलिए वह इसे संघनित कर सकता है: `सार्वजनिक स्थैतिक T LoadXMLFileIntoClass <T> (string xmlData)` {`XmlSerializer serializer = new XmlSaializer (typeof (T)); `वापसी (टी) धारावाहिक। डीज़रीलाइज़ (नया स्ट्रिंगरडर (xmlData)); `} धन्यवाद!
pwrgreg007


2

विचार यह है कि सभी स्तर को निर्जनता के लिए संभाला जाए। कृपया एक नमूना समाधान देखें जिससे मेरा समान मुद्दा हल हो

<?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> 

उपरोक्त XML दो स्तर में संभाला जाता है

  [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 बहुस्तरीय deserialization के लिए इस उदाहरण की जाँच के


1

यदि आपको अपनी xsd फ़ाइल बनाने के लिए xsd.exe का उपयोग करने में त्रुटि हो रही है, तो msdn पर बताए अनुसार XmlSchemaInference वर्ग का उपयोग करें । यहाँ एक इकाई परीक्षण प्रदर्शित करना है:

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. कुछ इस तरह का प्रयास करें: उस वर्ग ( 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();

नोट: आपको रूट नाम पर ध्यान देना चाहिए, इसे न बदलें। मेरा "ArrayOfClass1" है


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
कृपया अपना उत्तर हमेशा केवल कोड चिपकाने के बजाय संदर्भ में रखें। अधिक जानकारी के लिए यहां देखें ।
जिहबिसूमिस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.