มีวิธีง่าย ๆ ในการแยกวิเคราะห์ไฟล์ XML ใน C # หรือไม่? ถ้าเป็นเช่นนั้นอะไร
มีวิธีง่าย ๆ ในการแยกวิเคราะห์ไฟล์ XML ใน C # หรือไม่? ถ้าเป็นเช่นนั้นอะไร
คำตอบ:
ฉันจะใช้LINQ กับ XMLถ้าคุณอยู่ใน. NET 3.5 หรือสูงกว่า
มันง่ายมาก ฉันรู้ว่านี่เป็นวิธีมาตรฐาน แต่คุณสามารถสร้างห้องสมุดของคุณเองเพื่อจัดการกับสิ่งที่ดีกว่า
นี่คือตัวอย่างบางส่วน:
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);
นอกจากนี้ยังมีวิธีการอื่น ๆ ในการทำงานกับ ยกตัวอย่างเช่นที่นี่ และฉันคิดว่าไม่มีวิธีที่ดีที่สุดในการทำเช่นนี้ คุณต้องเลือกด้วยตัวเองเสมอสิ่งที่เหมาะสมที่สุดสำหรับคุณ
InnerText
ที่นี่รับค่าของโหนดนั้นต่อกันกับค่าทั้งหมดของโหนดลูก - ใช่ไหม? ดูเหมือนว่าเป็นเรื่องแปลกที่ต้องการ
InnerText
จะส่งกลับค่าโหนด - ซึ่งเป็นสิ่งที่ฉัน (และคนอื่นอาจอ่านคำถามนี้) ฉันกำลังแยกวิเคราะห์ XML เพื่อค้นหาในสถานที่แรก
ใช้XSD Schemaที่ดีเพื่อสร้างชุดคลาสที่มีxsd.exeและใช้XmlSerializer
เพื่อสร้างแผนผังวัตถุจาก XML ของคุณและในทางกลับกัน หากคุณมีข้อ จำกัด เล็กน้อยในโมเดลของคุณคุณสามารถลองสร้างการแม็พโดยตรงระหว่างคลาสโมเดลของคุณกับ XML ด้วยแอ็ตทริบิวต์ Xml *
มีบทความเบื้องต้นเกี่ยวกับ XML Serializationบน MSDN
เคล็ดลับประสิทธิภาพ: การสร้างและXmlSerializer
ราคาแพง อ้างอิงกับXmlSerializer
อินสแตนซ์ของคุณหากคุณต้องการแยก / เขียนไฟล์ XML หลายไฟล์
หากคุณกำลังประมวลผลข้อมูลจำนวนมาก (หลายเมกะไบต์) คุณต้องใช้XmlReader
เพื่อสตรีมแยกวิเคราะห์ XML
สิ่งอื่น ( XPathNavigator
, XElement
, XmlDocument
และแม้กระทั่งXmlSerializer
ถ้าคุณให้เต็มรูปแบบกราฟวัตถุที่สร้างขึ้น) จะส่งผลให้การใช้งานหน่วยความจำสูงและยังมีเวลาในการโหลดช้ามาก
แน่นอนถ้าคุณต้องการข้อมูลทั้งหมดในหน่วยความจำอย่างไรก็ตามคุณอาจไม่มีทางเลือกมากนัก
การใช้งานXmlTextReader
, XmlReader
, XmlNodeReader
และSystem.Xml.XPath
namespace และ ( XPathNavigator
, XPathDocument
, XPathExpression
, XPathnodeIterator
)
มักจะXPath
ทำให้การอ่าน XML ง่ายขึ้นซึ่งเป็นสิ่งที่คุณอาจมองหา
new XmlTextReader()
new XmlTextWriter()
พวกเขาเลิกใช้แล้วตั้งแต่. NET 2.0 ใช้XmlReader.Create()
หรือXmlWriter.Create()
แทน
ฉันเพิ่งได้รับการร้องขอให้ทำงานกับแอปพลิเคชันที่เกี่ยวข้องกับการแยกวิเคราะห์เอกสาร XML และฉันเห็นด้วยกับ Jon Galloway ว่าวิธีการที่ใช้ LINQ เป็น XML นั้นเป็นสิ่งที่ดีที่สุด อย่างไรก็ตามฉันต้องขุดเล็กน้อยเพื่อหาตัวอย่างที่ใช้งานได้ดังนั้นโดยไม่ต้องกังวลใจต่อไปนี่คือบางส่วน!
ความคิดเห็นใด ๆ ยินดีต้อนรับเป็นรหัสนี้ใช้งานได้ แต่อาจไม่สมบูรณ์และฉันต้องการเรียนรู้เพิ่มเติมเกี่ยวกับการแยกวิเคราะห์ XML สำหรับโครงการนี้!
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");
}
ด้วยฟังก์ชั่นเหล่านี้ฉันสามารถแยกองค์ประกอบและคุณลักษณะใด ๆ จากไฟล์ XML ได้โดยไม่มีปัญหา!
หากคุณกำลังใช้ NET 2.0 ลองXmlReader
และ subclasses ของตนและXmlTextReader
XmlValidatingReader
พวกเขามีวิธีที่รวดเร็วน้ำหนักเบา (การใช้หน่วยความจำ ฯลฯ ), ไปข้างหน้าอย่างเดียวในการแยกไฟล์ XML
หากคุณต้องการความสามารถในการลองXPath
หากคุณต้องการเอกสารทั้งหมดในหน่วยความจำลองXPathNavigator
XmlDocument
นอกจากนี้คุณสามารถใช้ตัวเลือก XPath ด้วยวิธีต่อไปนี้ (วิธีง่าย ๆ ในการเลือกโหนดที่ระบุ):
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);
ฉันไม่แน่ใจว่ามี "แนวปฏิบัติที่ดีที่สุดสำหรับการแยกวิเคราะห์ XML" หรือไม่ มีเทคโนโลยีมากมายที่เหมาะกับสถานการณ์ที่แตกต่างกัน วิธีการใช้งานขึ้นอยู่กับสถานการณ์ที่เป็นรูปธรรม
คุณสามารถไปกับLINQ กับ XML , XmlReader
, XPathNavigator
หรือแม้กระทั่งการแสดงออกปกติ หากคุณอธิบายความต้องการของคุณฉันสามารถลองให้คำแนะนำได้
คุณสามารถแยกวิเคราะห์ XML โดยใช้ไลบรารีSystem.Xml.Linq
นี้ ด้านล่างเป็นตัวอย่างรหัสที่ฉันใช้ในการแยกวิเคราะห์ไฟล์ 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;
}
คุณสามารถใช้ExtendedXmlSerializerเพื่อทำให้เป็นอนุกรมและดีซีเรียลไลซ์
การ ติดตั้งคุณสามารถติดตั้ง ExtendedXmlSerializer จากnugetหรือเรียกใช้คำสั่งต่อไปนี้:
Install-Package ExtendedXmlSerializer
อันดับ:
ExtendedXmlSerializer serializer = new ExtendedXmlSerializer();
var obj = new Message();
var xml = serializer.Serialize(obj);
ซีเรียลไลซ์
var obj2 = serializer.Deserialize<Message>(xml);
Serializer XML มาตรฐานใน. NET มีข้อ จำกัด มาก
ExtendedXmlSerializer สามารถทำสิ่งนี้และอีกมากมาย
ExtendedXmlSerializer สนับสนุน.NET 4.5หรือสูงกว่าและ.NET หลัก คุณสามารถรวมเข้ากับ WebApi และ AspCore
คุณสามารถใช้ XmlDocument และสำหรับจัดการหรือดึงข้อมูลจากแอ็ตทริบิวต์ที่คุณสามารถคลาส Linq ไปยัง XML