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 :-(
Jawaban:
Ini versi yang berfungsi. Saya mengubah
XmlElementAttribute
labelXmlElement
karena dalam xml nilai StockNumber, Make dan Model adalah elemen, bukan atribut. Saya juga menghapusreader.ReadToEnd();
( fungsi yang membaca seluruh aliran dan mengembalikan sebuah string, sehinggaDeserialize()
fungsi tidak dapat menggunakan pembaca lagi ... posisinya berada di ujung aliran). Saya juga mengambil beberapa kebebasan dengan penamaan :).Berikut kelas-kelasnya:
Fungsi Deserialize:
Dan xml yang sedikit tweak (saya perlu menambahkan elemen baru untuk membungkus <Cars> ... Net pilih-pilih tentang deserializing array):
sumber
[Serializable]
berlebihan jika menggunakanXmlSerializer
;XmlSerializer
tidak pernah memeriksa untuk itu. Demikian juga, sebagian besar[Xml...]
atribut berlebihan, karena hanya meniru perilaku default; yaitu secara default properti yang disebutStockNumber
disimpan sebagai elemen bernama<StockNumber>
- tidak perlu atribut untuk itu.Bagaimana kalau Anda hanya menyimpan xml ke file, dan menggunakan xsd untuk menghasilkan kelas C #?
xsd foo.xml
xsd foo.xsd /classes
Et voila - dan file kode C # yang harus dapat membaca data melalui
XmlSerializer
:(termasuk foo.cs yang dihasilkan dalam proyek)
sumber
Anda memiliki dua kemungkinan.
Metode 1. Alat XSD
Misalkan Anda memiliki file XML di lokasi ini
C:\path\to\xml\file.xml
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 Mulaicd /D "C:\path\to\xml"
xsd file.xml
xsd /c file.xsd
Dan itu dia! Anda telah menghasilkan kelas C # dari file xml di
C:\path\to\xml\file.cs
Metode 2 - Tempel khusus
Diperlukan Visual Studio 2012+
Edit > Paste special > Paste XML As Classes
Dan itu dia!
Pemakaian
Penggunaan sangat sederhana dengan kelas pembantu ini:
Yang harus Anda lakukan sekarang adalah:
sumber
Paste XML As Classes
perintah tersebut hanya menargetkan .NET 4.5Cuplikan berikut harus melakukan trik (dan Anda dapat mengabaikan sebagian besar atribut serialisasi):
...
sumber
Lihat apakah ini membantu:
.
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.
sumber
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:
sumber
coba blok kode ini jika file .xml Anda telah dihasilkan di suatu tempat di disk dan jika Anda telah menggunakan
List<T>
:Catatan:
C:\serialize.xml
adalah jalur file .xml saya. Anda dapat mengubahnya untuk kebutuhan Anda.sumber
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:
Dan kemudian Anda cukup menelepon:
sumber
Coba Kelas Generik ini Untuk Xml Serialisasi & Deserialisasi.
sumber
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
path
ke 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:
Bit kode lain yang disediakan oleh @erymski ...
... masuk ke program utama Anda (Program.cs),
static CarCollection XCar()
seperti ini:Semoga bisa membantu :-)
sumber
Bagaimana dengan kelas generik untuk deserialize dokumen XML
Bagian ini mungkin, atau mungkin tidak diperlukan. Buka dokumen XML di Visual Studio, klik kanan pada XML, pilih properti. Kemudian pilih file skema Anda.
sumber
Satu liner:
sumber
Idenya adalah agar semua level ditangani untuk deserialisasi. Silakan lihat solusi sampel yang memecahkan masalah saya yang serupa
XML di atas ditangani dalam dua level
Tingkat dalam
Dengan cara yang sama Anda perlu beberapa level dengan
car as array
Periksa contoh ini untuk deserialisasi bertingkatsumber
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:
sumber
Anda cukup mengubah satu atribut untuk properti Mobil Anda dari XmlArrayItem ke XmlElment. Itu dari
untuk
sumber
Solusi saya:
Edit > Past Special > Paste XML As Classes
untuk mendapatkan kelas dalam kode AndaList<class1
>), lalu gunakanXmlSerializer
untuk membuat cerita bersambung daftar itu kexml
file.deserialize
.Kode:
CATATAN: Anda harus memperhatikan nama root, jangan mengubahnya. Milik saya adalah "ArrayOfClass1"
sumber
sumber