Bagaimana Deserialize dokumen XML

472

Bagaimana cara Deserialisasi dokumen XML ini:

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

Aku punya ini:

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

yang sepertinya tidak berhasil :-(

Alex
sumber
Saya pikir Anda perlu melarikan diri dari kurung sudut dalam dokumen sampel Anda.
harpo
4
Jawaban ini benar-benar sangat baik: stackoverflow.com/a/19613934/196210
Revious

Jawaban:

359

Ini versi yang berfungsi. Saya mengubah XmlElementAttributelabel XmlElementkarena dalam xml nilai StockNumber, Make dan Model adalah elemen, bukan atribut. Saya juga menghapus reader.ReadToEnd();( fungsi yang membaca seluruh aliran dan mengembalikan sebuah string, sehingga Deserialize()fungsi tidak dapat menggunakan pembaca lagi ... posisinya berada di ujung aliran). Saya juga mengambil beberapa kebebasan dengan penamaan :).

Berikut kelas-kelasnya:

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

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

Dan xml yang sedikit tweak (saya perlu menambahkan elemen baru untuk membungkus <Cars> ... Net pilih-pilih tentang deserializing array):

<?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>
Kevin Tighe
sumber
68
Itu [Serializable]berlebihan jika menggunakan XmlSerializer; XmlSerializertidak pernah memeriksa untuk itu. Demikian juga, sebagian besar [Xml...]atribut berlebihan, karena hanya meniru perilaku default; yaitu secara default properti yang disebut StockNumberdisimpan sebagai elemen bernama <StockNumber>- tidak perlu atribut untuk itu.
Marc Gravell
3
Perhatikan bahwa XmlElementAttribute = XmlElement (ini adalah fitur bahasa yang Anda bisa hilangkan suffix "Attribute"). Solusi sebenarnya di sini adalah menghapus panggilan ReadToEnd () dan menambahkan node root. Tetapi lebih baik gunakan kode dari erymski yang memecahkan pertanyaan (parsing xml yang diberikan)
Flamefire
2
Terima kasih Kevin, Tetapi bagaimana jika saya menghapus CarsCollection dari sampel XML. Saya menghapus Carscollection dari kelas dan Deserealize code, tetapi tidak berhasil.
Vikrant
441

Bagaimana kalau Anda hanya menyimpan xml ke file, dan menggunakan xsd untuk menghasilkan kelas C #?

  1. Tulis file ke disk (saya beri nama foo.xml)
  2. Hasilkan xsd: xsd foo.xml
  3. Hasilkan C #: xsd foo.xsd /classes

Et voila - dan file kode C # yang harus dapat membaca data melalui XmlSerializer:

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

(termasuk foo.cs yang dihasilkan dalam proyek)

Marc Gravell
sumber
6
Kamulah orangnya! Terima kasih. untuk siapa pun yang membutuhkannya, "path" dapat menjadi Stream yang Anda buat dari respons web seperti: var resp = response.Content.ReadAsByteArrayAsync (); var stream = MemoryStream baru (resp.Result);
Induster
1
Ide yang luar biasa, tetapi tidak bisa berfungsi dengan benar untuk model saya yang sedikit lebih rumit dengan kumpulan array bersarang. Saya terus mendapatkan kesalahan konversi jenis untuk array bersarang - ditambah skema penamaan yang dihasilkan meninggalkan sesuatu yang diinginkan. Karena itu saya akhirnya memilih rute khusus.
GotDibbs
9
Bagaimana menuju ke xsd.exe
jwillmer
2
xsd.exe tersedia dari prompt perintah visual studio, bukan prompt perintah windows. Lihat apakah Anda dapat membuka prompt perintah dari dalam studio visual di bawah Alat. Jika tidak, coba akses dari folder visual studio. Untuk VS 2012 terletak di sini: C: \ Program Files (x86) \ Microsoft Visual Studio 12.0 \ Common7 \ Tools \ Shortcuts. Di Windows 8 coba cari "Visual Studio Tools".
goku_da_master
2
Untuk semua orang yang mencari XSD. Inilah utas SO: stackoverflow.com/questions/22975031/…
SOReader
229

Anda memiliki dua kemungkinan.

Metode 1. Alat XSD


Misalkan Anda memiliki file XML di lokasi ini C:\path\to\xml\file.xml

  1. Buka Prompt Perintah Pengembang
    Anda dapat menemukannya di Start Menu > Programs > Microsoft Visual Studio 2012 > Visual Studio Tools Atau jika Anda memiliki Windows 8 dapat mulai mengetik Prompt Perintah Pengembang di layar Mulai
  2. Ubah lokasi ke direktori file XML Anda dengan mengetik cd /D "C:\path\to\xml"
  3. Buat file XSD dari file xml Anda dengan mengetikxsd file.xml
  4. Buat kelas C # dengan mengetikxsd /c file.xsd

Dan itu dia! Anda telah menghasilkan kelas C # dari file xml diC:\path\to\xml\file.cs

Metode 2 - Tempel khusus


Diperlukan Visual Studio 2012+

  1. Salin konten file XML Anda ke clipboard
  2. Tambahkan ke solusi Anda, file kelas kosong baru ( Shift+ Alt+ C)
  3. Buka file itu dan klik menu Edit > Paste special > Paste XML As Classes
    masukkan deskripsi gambar di sini

Dan itu dia!

Pemakaian


Penggunaan sangat sederhana dengan kelas pembantu ini:

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

Yang harus Anda lakukan sekarang adalah:

    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>();
Damian Drygiel
sumber
16
+1 jawaban yang bagus. Tetapi, Paste XML As Classesperintah tersebut hanya menargetkan .NET 4.5
ravy amiry
1
Ini adalah cara yang bagus untuk menghasilkan model jika Anda telah menginstal vs2012 +. Saya menjalankan pembersihan kode ReSharper setelahnya untuk menggunakan properti otomatis dan kemudian melakukan beberapa perbaikan juga. Anda dapat menghasilkan melalui metode ini dan kemudian menyalin ke proj yang lebih tua jika perlu.
Scotty.NET
4
Menargetkan .net4.5 tidak menjadi masalah. Hanya jalankan proyek sementara dengan dotnet4.5, lakukan copy-paste di sana dan salin sumber ke proyek Anda yang sebenarnya.
LosManos
2
di mana objek atau kelas "katalog"?
CB4
3
Agar "Tempel XML sebagai kelas" muncul di menu pada Komunitas VS 2017 Anda harus menginstal "ASP.NET dan pengembangan web". Jika hilang, jalankan VS installer lagi untuk memodifikasi instalasi Anda.
Slion
89

Cuplikan berikut harus melakukan trik (dan Anda dapat mengabaikan sebagian besar atribut serialisasi):

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

sumber
14
Ini sebenarnya satu-satunya jawaban. Jawaban yang diterima memiliki beberapa kelemahan yang dapat membingungkan pemula.
Flamefire
24

Lihat apakah ini membantu:

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

Dan gagal yang menggunakan program xsd.exe yang datang dengan visual studio untuk membuat dokumen skema berdasarkan file xml itu, dan kemudian menggunakannya lagi untuk membuat kelas berdasarkan dokumen skema.

Joel Coehoorn
sumber
9

Saya tidak berpikir .net 'pilih-pilih tentang deserializing array'. Dokumen xml pertama tidak terbentuk dengan baik. Tidak ada elemen root, meskipun sepertinya ada. Dokumen xml kanonik memiliki root dan setidaknya 1 elemen (jika ada). Dalam contoh Anda:

<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>
janbak
sumber
7

coba blok kode ini jika file .xml Anda telah dihasilkan di suatu tempat di disk dan jika Anda telah menggunakan 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();`

Catatan: C:\serialize.xmladalah jalur file .xml saya. Anda dapat mengubahnya untuk kebutuhan Anda.

nainwal sheetal
sumber
6

Anvin Kevin bagus, selain dari kenyataan, bahwa di dunia nyata, Anda sering tidak dapat mengubah XML asli sesuai dengan kebutuhan Anda.

Ada juga solusi sederhana untuk XML asli:

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

Dan kemudian Anda cukup menelepon:

var ser = new XmlSerializer(typeof(XmlData));
XmlData data = (XmlData)ser.Deserialize(XmlReader.Create(PathToCarsXml));
Kim Homann
sumber
Terima kasih! Jawaban Anda persis seperti yang saya butuhkan, karena saya tidak ingin mengubah file log senilai gigabytes.
Colin
Meskipun perlu disebutkan bahwa solusi XmlSerializer sangat elegan tetapi diakui juga tidak terlalu cepat dan bereaksi secara sensitif terhadap data Xml yang tidak terduga. Jadi, jika masalah Anda tidak memerlukan deserialisasi lengkap, Anda harus mempertimbangkan menggunakan kelas XmlReader yang lebih pragmatis dan berkinerja tinggi dan mengulang-ulang elemen <Car>.
Kim Homann
5

Coba Kelas Generik ini Untuk Xml Serialisasi & Deserialisasi.

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;
    }
}
Hasan Javaid
sumber
4

Untuk pemula

Saya menemukan jawaban di sini sangat membantu, yang mengatakan saya masih berjuang (hanya sedikit) untuk mendapatkan ini berfungsi. Jadi, jika itu membantu seseorang saya akan menguraikan solusi yang berfungsi:

XML dari Pertanyaan Asli. Xml ada dalam file Class1.xml, a pathke file ini digunakan dalam kode untuk menemukan file xml ini.

Saya menggunakan jawaban oleh @erymski untuk membuatnya berfungsi, jadi membuat file bernama Car.cs dan menambahkan yang berikut:

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

Bit kode lain yang disediakan oleh @erymski ...

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

... masuk ke program utama Anda (Program.cs), static CarCollection XCar()seperti ini:

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

Semoga bisa membantu :-)

SlowLearner
sumber
1
Ini berhasil untuk saya. Ini adalah solusi yang berfungsi sempurna untuk input xml yang diberikan (seperti dalam contoh OP) juga. [XmlElement ("Car")] adalah atribut yang tepat. Dalam contoh lain mereka menggunakan XmlArray dll yang tidak diperlukan selama kita memiliki properti yang didefinisikan sebagai Mobil umum [] Mobil {dapatkan; set; } dan itu akan deserialize dengan benar. Terima kasih.
Diwakar Padmaraja
3

Bagaimana dengan kelas generik untuk deserialize dokumen 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;
}

Bagian ini mungkin, atau mungkin tidak diperlukan. Buka dokumen XML di Visual Studio, klik kanan pada XML, pilih properti. Kemudian pilih file skema Anda.

David C Fuchs
sumber
1
Ini memungkinkan saya untuk sedikit mengecilkan kode logika bisnis dan memusatkan fungsionalitas dalam kelas pembantu dengan semua kelas <T> yang saya hasilkan. Saya sudah memiliki XML dalam sebuah string, jadi bisa menyingkatnya menjadi ini: `public static T LoadXMLFileIntoClass <T> (string xmlData)` {`XmlSerializer serializer = new XmlSerializer (typeof (T)); `return (T) serializer.Deserialize (StringReader baru (xmlData))); `} Terima kasih!
pwrgreg007
3

Satu liner:

var object = (Cars)new XmlSerializer(typeof(Cars)).Deserialize(new StringReader(xmlString));
Andre M
sumber
2

Idenya adalah agar semua level ditangani untuk deserialisasi. Silakan lihat solusi sampel yang memecahkan masalah saya yang serupa

<?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 di atas ditangani dalam dua level

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

}

Tingkat dalam

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

}

Dengan cara yang sama Anda perlu beberapa level dengan car as array Periksa contoh ini untuk deserialisasi bertingkat

makdu
sumber
1

Jika Anda mendapatkan kesalahan menggunakan xsd.exe untuk membuat file xsd Anda, maka gunakan kelas XmlSchemaInference seperti yang disebutkan di msdn . Inilah tes unit untuk diperagakan:

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
goku_da_master
sumber
1

Anda cukup mengubah satu atribut untuk properti Mobil Anda dari XmlArrayItem ke XmlElment. Itu dari

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

untuk

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

Solusi saya:

  1. Gunakan Edit > Past Special > Paste XML As Classesuntuk mendapatkan kelas dalam kode Anda
  2. Coba sesuatu seperti ini: buat daftar kelas itu ( List<class1>), lalu gunakan XmlSerializeruntuk membuat cerita bersambung daftar itu ke xmlfile.
  3. Sekarang Anda tinggal mengganti isi file itu dengan data Anda dan mencobanya deserialize.

Kode:

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

CATATAN: Anda harus memperhatikan nama root, jangan mengubahnya. Milik saya adalah "ArrayOfClass1"

haiduong87
sumber
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;
}
Zoidbergseasharp
sumber
1
Harap berikan jawaban Anda selalu dalam konteks alih-alih hanya menempelkan kode. Lihat di sini untuk detail lebih lanjut.
gehbiszumeis