Bagaimana cara mem-parsing file XML? [Tutup]

492

Apakah ada metode sederhana untuk mem-parsing file XML dalam C #? Jika ya, apa?

domoaringatoo
sumber
Anda bisa menggunakan implementasi ini: stackoverflow.com/a/34813985/5784646
Eulogy
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.

Jon Galloway
sumber
314

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= new XmlDocument(); // Create an XML document object
xmlDoc.Load("yourXMLFile.xml"); // Load the XML document from the specified file

// Get elements
XmlNodeList girlAddress = xmlDoc.GetElementsByTagName("gAddress");
XmlNodeList girlAge = xmlDoc.GetElementsByTagName("gAge"); 
XmlNodeList girlCellPhoneNumber = xmlDoc.GetElementsByTagName("gPhone");

// Display the results
Console.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.

Lukas Šalkauskas
sumber
47
+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.

Ada artikel pengantar tentang Serialisasi XML pada MSDN.

Kiat kinerja: Membuat sebuah XmlSerializermahal. Simpan referensi ke XmlSerializerinstance Anda jika Anda bermaksud mem-parsing / menulis beberapa file XML.

David Schmitt
sumber
5
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.

Simon Steele
sumber
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!

public void ParseXML(string filePath)  
{  
    // create document instance using XML file path
    XDocument 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 tag
    IEnumerable<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 doc
    XElement element = (from c in doc.Descendants(ns + "exampleTagName" select c).First();

    // obtain an element from within an element, same as from doc
    XElement embeddedElement = (from c in element.Descendants(ns + "exampleEmbeddedTagName" select c).First();

    // obtain an attribute from an element
    XAttribute attribute = element.Attribute("exampleAttributeName");
}

Dengan fungsi-fungsi ini saya dapat mengurai elemen dan atribut apa pun dari file XML tidak ada masalah sama sekali!

PJRobot
sumber
8

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.

Abu
sumber
7

Selain itu, Anda dapat menggunakan pemilih XPath dengan cara berikut (cara mudah untuk memilih node tertentu):

XmlDocument doc = new XmlDocument();
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);

dokumentasi

Joel Harkes
sumber
6

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.

aku
sumber
3
regex untuk xml. kau monster.
akan
3

Anda dapat menguraikan XML menggunakan perpustakaan ini System.Xml.Linq. Di bawah ini adalah contoh kode yang saya gunakan untuk mem-parsing file XML

public CatSubCatList GenerateCategoryListFromProductFeedXML()
{
    string path = System.Web.HttpContext.Current.Server.MapPath(_xmlFilePath);

    XDocument xDoc = XDocument.Load(path);

    XElement xElement = XElement.Parse(xDoc.ToString());


    List<Category> lstCategory = xElement.Elements("Product").Select(d => new Category
    {
        Code = Convert.ToString(d.Element("CategoryCode").Value),
        CategoryPath = d.Element("CategoryPath").Value,
        Name = GetCateOrSubCategory(d.Element("CategoryPath").Value, 0), // Category
        SubCategoryName = GetCateOrSubCategory(d.Element("CategoryPath").Value, 1) // Sub Category
    }).GroupBy(x => new { x.Code, x.SubCategoryName }).Select(x => x.First()).ToList();

    CatSubCatList catSubCatList = GetFinalCategoryListFromXML(lstCategory);

    return catSubCatList;
}
Tapan kumar
sumber
1

Anda dapat menggunakan ExtendedXmlSerializer untuk membuat serial dan deserialize.

Instalasi Anda dapat menginstal ExtendedXmlSerializer dari nuget atau menjalankan perintah berikut:

Install-Package ExtendedXmlSerializer

Serialisasi:

ExtendedXmlSerializer serializer = new ExtendedXmlSerializer();
var obj = new Message();
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.

Wojtpl2
sumber
1

Anda dapat menggunakan XmlDocument dan untuk memanipulasi atau mengambil data dari atribut yang Anda dapat Linq ke kelas XML.

shaishav shukla
sumber