Apakah ada metode sederhana untuk mem-parsing file XML dalam C #? Jika ya, apa?
Apakah ada metode sederhana untuk mem-parsing file XML dalam C #? Jika ya, apa?
Jawaban:
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= 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.
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 ke XmlSerializer
instance Anda jika Anda bermaksud mem-parsing / menulis beberapa file XML.
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 bahkan XmlSerializer
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.
Gunakan XmlTextReader
, XmlReader
, XmlNodeReader
dan System.Xml.XPath
namespace. Dan ( XPathNavigator
, XPathDocument
, XPathExpression
, XPathnodeIterator
).
Biasanya XPath
membuat membaca XML lebih mudah, yang mungkin Anda cari.
new XmlTextReader()
atau new XmlTextWriter()
. Mereka telah ditinggalkan sejak. NET 2.0. Gunakan XmlReader.Create()
atau XmlWriter.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!
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!
Jika Anda menggunakan .NET 2.0, coba XmlReader
dan subkelasnya XmlTextReader
, dan XmlValidatingReader
. Mereka menyediakan cara yang cepat, ringan (penggunaan memori, dll.), Hanya untuk maju untuk mem-parsing file XML.
Jika Anda memerlukan XPath
kemampuan, 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 = 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);
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.
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;
}
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.
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.
Anda dapat menggunakan XmlDocument dan untuk memanipulasi atau mengambil data dari atribut yang Anda dapat Linq ke kelas XML.