Oke, saya buka kembali ini. Duplikat adalah solusi Pembaca XML di mana karena ini adalah tentang parsing file XML. The duplikat posssible dapat dilihat pada pertanyaan mengedit sejarah ps @GeorgeStocker
Jeremy Thompson
1
@JeremyThompson Salah satu alasan mengapa ini adalah duplikat adalah pertanyaan lain memiliki jawaban yang jauh lebih baik. Jawaban teratas sebagai jawaban "hanya tautan" sederhana tidak berguna.
George Stocker
1
@ GeorgeStocker pertanyaan cukup berbeda untuk hidup berdampingan dan keduanya memiliki jawaban yang bagus , ditambah yang diterima menggunakan teknologi yang berbeda. Itu sebabnya saya memilih kita membiarkan ini terbuka, saya tahu ini diterima hanya tautan tetapi itu MSDN dan ditulis pada waktu sebelum itu tidak dapat diterima, semoga efek samping dari pembukaan kembali sedikit menyemangati Jon, membaca profilnya . Pokoknya bersorak.
Jeremy Thompson
Jawaban:
245
Saya akan menggunakan LINQ ke XML jika Anda menggunakan .NET 3.5 atau lebih tinggi.
Ini sangat sederhana. Saya tahu ini adalah metode standar, tetapi Anda dapat membuat perpustakaan Anda sendiri untuk menghadapinya dengan jauh lebih baik.
Berikut ini beberapa contohnya:
XmlDocument xmlDoc=newXmlDocument();// Create an XML document object
xmlDoc.Load("yourXMLFile.xml");// Load the XML document from the specified file// Get elementsXmlNodeList girlAddress = xmlDoc.GetElementsByTagName("gAddress");XmlNodeList girlAge = xmlDoc.GetElementsByTagName("gAge");XmlNodeList girlCellPhoneNumber = xmlDoc.GetElementsByTagName("gPhone");// Display the resultsConsole.WriteLine("Address: "+ girlAddress[0].InnerText);Console.WriteLine("Age: "+ girlAge[0].InnerText);Console.WriteLine("Phone Number: "+ girlCellPhoneNumber[0].InnerText);
Juga, ada beberapa metode lain yang bisa digunakan. Misalnya di sini . Dan saya pikir tidak ada satu metode terbaik untuk melakukan ini; Anda selalu harus memilihnya sendiri, apa yang paling cocok untuk Anda.
+1 untuk menyebutkan XmlDocument, yang jauh lebih nyaman daripada antarmuka serialisasi dalam beberapa kasus. Jika Anda setelah satu elemen tertentu, Anda dapat mengakses elemen anak dengan pengindeks: xmlDoc ["Root"], dan ini dapat dirantai: xmlDoc ["Root"] ["Folder"] ["Item"] untuk menggali hierarki (walaupun masuk akal untuk memvalidasi bahwa unsur-unsur ini benar-benar ada)
Jason Williams
1
InnerTextdi sini mendapatkan nilai simpul itu, disatukan dengan semua nilai simpul anak - benar? Sepertinya hal aneh yang diinginkan.
Don Cheadle
17
Seorang programmer dengan daftar teman wanita? Shenanigans!
E. van Putten
1
@ E.vanPutten tidak di zaman sekarang ini. Ini bukan Revenge of the Nerds
user4052054
@ DonCheadle Jika Anda tidak mengharapkan akan ada simpul anak, maka InnerTexthanya akan mengembalikan nilai simpul - yang adalah apa yang saya (dan mungkin semua orang membaca pertanyaan ini) mengurai XML untuk menemukan di tempat pertama.
F1Krazy
48
Gunakan Skema XSD yang baik untuk membuat satu set kelas dengan xsd.exe dan gunakan XmlSerializeruntuk membuat pohon objek dari XML Anda dan sebaliknya. Jika Anda memiliki sedikit batasan pada model Anda, Anda bahkan bisa mencoba membuat pemetaan langsung antara kelas model Anda dan XML dengan Xml * Attributes.
Kiat kinerja: Membuat sebuah XmlSerializermahal. Simpan referensi ke XmlSerializerinstance Anda jika Anda bermaksud mem-parsing / menulis beberapa file XML.
Contoh yang baik adalah "Contoh Pesanan Pembelian" di tengah contoh ini dari microsoft. msdn.microsoft.com/en-us/library/58a18dwa.aspx . Anda menghindari keharusan membuat skema - kelas c # Anda adalah skema, yang dihiasi dengan atribut C #.
Mark Lakata
25
Jika Anda sedang memproses sejumlah besar data (banyak megabita) maka Anda ingin menggunakan XmlReaderuntuk melakukan streaming parsing XML.
Ada lagi ( XPathNavigator, XElement, XmlDocumentdan bahkan XmlSerializerjika Anda menyimpan objek grafik yang dihasilkan penuh) akan menghasilkan penggunaan memori yang tinggi dan juga waktu beban yang sangat lambat.
Tentu saja, jika Anda memerlukan semua data dalam memori, maka Anda mungkin tidak punya banyak pilihan.
FYI, Anda tidak boleh menggunakan new XmlTextReader()atau new XmlTextWriter(). Mereka telah ditinggalkan sejak. NET 2.0. Gunakan XmlReader.Create()atau XmlWriter.Create()sebagai gantinya.
John Saunders
10
Saya baru saja diminta untuk mengerjakan aplikasi yang melibatkan penguraian dokumen XML dan saya setuju dengan Jon Galloway bahwa pendekatan berbasis LINQ to XML, menurut saya, adalah yang terbaik. Namun saya harus menggali sedikit untuk menemukan contoh yang dapat digunakan, jadi tanpa basa-basi lagi, berikut adalah beberapa!
Setiap komentar diterima karena kode ini berfungsi tetapi mungkin tidak sempurna dan saya ingin mempelajari lebih lanjut tentang parsing XML untuk proyek ini!
publicvoidParseXML(string filePath){// create document instance using XML file pathXDocument doc =XDocument.Load(filePath);// get the namespace to that within of the XML (xmlns="...")XElement root = doc.Root;XNamespace ns = root.GetDefaultNamespace();// obtain a list of elements with specific tagIEnumerable<XElement> elements =from c in doc.Descendants(ns +"exampleTagName")select c;// obtain a single element with specific tag (first instance), useful if only expecting one instance of the tag in the target docXElement element =(from c in doc.Descendants(ns +"exampleTagName"select c).First();// obtain an element from within an element, same as from docXElement embeddedElement =(from c in element.Descendants(ns +"exampleEmbeddedTagName"select c).First();// obtain an attribute from an elementXAttribute attribute = element.Attribute("exampleAttributeName");}
Dengan fungsi-fungsi ini saya dapat mengurai elemen dan atribut apa pun dari file XML tidak ada masalah sama sekali!
Jika Anda menggunakan .NET 2.0, coba XmlReaderdan subkelasnya XmlTextReader, dan XmlValidatingReader. Mereka menyediakan cara yang cepat, ringan (penggunaan memori, dll.), Hanya untuk maju untuk mem-parsing file XML.
Jika Anda memerlukan XPathkemampuan, coba XPathNavigator. Jika Anda membutuhkan seluruh dokumen dalam memori coba XmlDocument.
Selain itu, Anda dapat menggunakan pemilih XPath dengan cara berikut (cara mudah untuk memilih node tertentu):
XmlDocument doc =newXmlDocument();
doc.Load("test.xml");var found = doc.DocumentElement.SelectNodes("//book[@title='Barry Poter']");// select all Book elements in whole dom, with attribute title with value 'Barry Poter'// Retrieve your data here or change XML here:foreach(XmlNode book in nodeList){
book.InnerText="The story began as it was...";}Console.WriteLine("Display XML:");
doc.Save(Console.Out);
Saya tidak yakin apakah "praktik terbaik untuk parsing XML" ada. Ada banyak teknologi yang cocok untuk situasi yang berbeda. Cara mana yang digunakan tergantung pada skenario konkret.
Anda dapat pergi dengan LINQ ke XML , XmlReader, XPathNavigatoratau bahkan ekspresi reguler. Jika Anda menguraikan kebutuhan Anda, saya dapat mencoba memberikan beberapa saran.
Instalasi
Anda dapat menginstal ExtendedXmlSerializer dari nuget atau menjalankan perintah berikut:
Install-PackageExtendedXmlSerializer
Serialisasi:
ExtendedXmlSerializer serializer =newExtendedXmlSerializer();var obj =newMessage();var xml = serializer.Serialize(obj);
Deserialisasi
var obj2 = serializer.Deserialize<Message>(xml);
Serializer XML standar di .NET sangat terbatas.
Tidak mendukung serialisasi kelas dengan referensi melingkar atau kelas dengan properti antarmuka,
Tidak mendukung Kamus,
Tidak ada mekanisme untuk membaca versi lama XML,
Jika Anda ingin membuat serializer khusus, kelas Anda harus mewarisi dari IXmlSerializable. Ini berarti bahwa kelas Anda tidak akan menjadi kelas POCO,
Tidak mendukung IoC.
ExtendedXmlSerializer dapat melakukan ini dan banyak lagi.
ExtendedXmlSerializer mendukung .NET 4.5 atau lebih tinggi dan .NET Core . Anda dapat mengintegrasikannya dengan WebApi dan AspCore.
Jawaban:
Saya akan menggunakan LINQ ke XML jika Anda menggunakan .NET 3.5 atau lebih tinggi.
sumber
Ini sangat sederhana. Saya tahu ini adalah metode standar, tetapi Anda dapat membuat perpustakaan Anda sendiri untuk menghadapinya dengan jauh lebih baik.
Berikut ini beberapa contohnya:
Juga, ada beberapa metode lain yang bisa digunakan. Misalnya di sini . Dan saya pikir tidak ada satu metode terbaik untuk melakukan ini; Anda selalu harus memilihnya sendiri, apa yang paling cocok untuk Anda.
sumber
InnerText
di sini mendapatkan nilai simpul itu, disatukan dengan semua nilai simpul anak - benar? Sepertinya hal aneh yang diinginkan.InnerText
hanya akan mengembalikan nilai simpul - yang adalah apa yang saya (dan mungkin semua orang membaca pertanyaan ini) mengurai XML untuk menemukan di tempat pertama.Gunakan Skema XSD yang baik untuk membuat satu set kelas dengan xsd.exe dan gunakan
XmlSerializer
untuk membuat pohon objek dari XML Anda dan sebaliknya. Jika Anda memiliki sedikit batasan pada model Anda, Anda bahkan bisa mencoba membuat pemetaan langsung antara kelas model Anda dan XML dengan Xml * Attributes.Ada artikel pengantar tentang Serialisasi XML pada MSDN.
Kiat kinerja: Membuat sebuah
XmlSerializer
mahal. Simpan referensi keXmlSerializer
instance Anda jika Anda bermaksud mem-parsing / menulis beberapa file XML.sumber
Jika Anda sedang memproses sejumlah besar data (banyak megabita) maka Anda ingin menggunakan
XmlReader
untuk melakukan streaming parsing XML.Ada lagi (
XPathNavigator
,XElement
,XmlDocument
dan bahkanXmlSerializer
jika Anda menyimpan objek grafik yang dihasilkan penuh) akan menghasilkan penggunaan memori yang tinggi dan juga waktu beban yang sangat lambat.Tentu saja, jika Anda memerlukan semua data dalam memori, maka Anda mungkin tidak punya banyak pilihan.
sumber
Gunakan
XmlTextReader
,XmlReader
,XmlNodeReader
danSystem.Xml.XPath
namespace. Dan (XPathNavigator
,XPathDocument
,XPathExpression
,XPathnodeIterator
).Biasanya
XPath
membuat membaca XML lebih mudah, yang mungkin Anda cari.sumber
new XmlTextReader()
ataunew XmlTextWriter()
. Mereka telah ditinggalkan sejak. NET 2.0. GunakanXmlReader.Create()
atauXmlWriter.Create()
sebagai gantinya.Saya baru saja diminta untuk mengerjakan aplikasi yang melibatkan penguraian dokumen XML dan saya setuju dengan Jon Galloway bahwa pendekatan berbasis LINQ to XML, menurut saya, adalah yang terbaik. Namun saya harus menggali sedikit untuk menemukan contoh yang dapat digunakan, jadi tanpa basa-basi lagi, berikut adalah beberapa!
Setiap komentar diterima karena kode ini berfungsi tetapi mungkin tidak sempurna dan saya ingin mempelajari lebih lanjut tentang parsing XML untuk proyek ini!
Dengan fungsi-fungsi ini saya dapat mengurai elemen dan atribut apa pun dari file XML tidak ada masalah sama sekali!
sumber
Jika Anda menggunakan .NET 2.0, coba
XmlReader
dan subkelasnyaXmlTextReader
, danXmlValidatingReader
. Mereka menyediakan cara yang cepat, ringan (penggunaan memori, dll.), Hanya untuk maju untuk mem-parsing file XML.Jika Anda memerlukan
XPath
kemampuan, cobaXPathNavigator
. Jika Anda membutuhkan seluruh dokumen dalam memori cobaXmlDocument
.sumber
Selain itu, Anda dapat menggunakan pemilih XPath dengan cara berikut (cara mudah untuk memilih node tertentu):
dokumentasi
sumber
Saya tidak yakin apakah "praktik terbaik untuk parsing XML" ada. Ada banyak teknologi yang cocok untuk situasi yang berbeda. Cara mana yang digunakan tergantung pada skenario konkret.
Anda dapat pergi dengan LINQ ke XML ,
XmlReader
,XPathNavigator
atau bahkan ekspresi reguler. Jika Anda menguraikan kebutuhan Anda, saya dapat mencoba memberikan beberapa saran.sumber
Anda dapat menguraikan XML menggunakan perpustakaan ini
System.Xml.Linq
. Di bawah ini adalah contoh kode yang saya gunakan untuk mem-parsing file XMLsumber
Anda dapat menggunakan ExtendedXmlSerializer untuk membuat serial dan deserialize.
Instalasi Anda dapat menginstal ExtendedXmlSerializer dari nuget atau menjalankan perintah berikut:
Serialisasi:
Deserialisasi
Serializer XML standar di .NET sangat terbatas.
ExtendedXmlSerializer dapat melakukan ini dan banyak lagi.
ExtendedXmlSerializer mendukung .NET 4.5 atau lebih tinggi dan .NET Core . Anda dapat mengintegrasikannya dengan WebApi dan AspCore.
sumber
Anda dapat menggunakan XmlDocument dan untuk memanipulasi atau mengambil data dari atribut yang Anda dapat Linq ke kelas XML.
sumber