ฉันจะอ่านและแยกวิเคราะห์ไฟล์ XML ใน C # ได้อย่างไร
ฉันจะอ่านและแยกวิเคราะห์ไฟล์ XML ใน C # ได้อย่างไร
คำตอบ:
XmlDocument เพื่ออ่าน XML จากสตริงหรือจากไฟล์
XmlDocument doc = new XmlDocument();
doc.Load("c:\\temp.xml");
หรือ
doc.LoadXml("<xml>something</xml>");
จากนั้นหาโหนดด้านล่างมันเช่นนี้
XmlNode node = doc.DocumentElement.SelectSingleNode("/book/title");
หรือ
foreach(XmlNode node in doc.DocumentElement.ChildNodes){
string text = node.InnerText; //or loop through its children as well
}
จากนั้นอ่านข้อความในโหนดนั้นเช่นนี้
string text = node.InnerText;
หรืออ่านคุณสมบัติ
string attr = node.Attributes["theattributename"]?.InnerText
ตรวจสอบค่าว่างของแอตทริบิวต์ ["บางอย่าง"] เสมอเนื่องจากจะเป็นค่าว่างหากแอตทริบิวต์นั้นไม่มีอยู่
XmlNode node = XmlDocument.Docu...
เส้นไม่ควรเป็นจริงXmlNode = doc.Docu...
หรือ ทำไมคำตอบถูกเปลี่ยนและdoc.
ลบออก?
// Loading from a file, you can also load from a stream
var xml = XDocument.Load(@"C:\contacts.xml");
// Query the data and write out a subset of contacts
var query = from c in xml.Root.Descendants("contact")
where (int)c.Attribute("id") < 4
select c.Element("firstName").Value + " " +
c.Element("lastName").Value;
foreach (string name in query)
{
Console.WriteLine("Contact's Full Name: {0}", name);
}
การอ้างอิง : LINQ ถึง XMLที่ MSDN
นี่คือแอปพลิเคชันที่ฉันเขียนเพื่ออ่านแผนผังไซต์ xml:
using System;
using System.Collections.Generic;
using System.Windows.Forms;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;
using System.Data;
using System.Xml;
namespace SiteMapReader
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Please Enter the Location of the file");
// get the location we want to get the sitemaps from
string dirLoc = Console.ReadLine();
// get all the sitemaps
string[] sitemaps = Directory.GetFiles(dirLoc);
StreamWriter sw = new StreamWriter(Application.StartupPath + @"\locs.txt", true);
// loop through each file
foreach (string sitemap in sitemaps)
{
try
{
// new xdoc instance
XmlDocument xDoc = new XmlDocument();
//load up the xml from the location
xDoc.Load(sitemap);
// cycle through each child noed
foreach (XmlNode node in xDoc.DocumentElement.ChildNodes)
{
// first node is the url ... have to go to nexted loc node
foreach (XmlNode locNode in node)
{
// thereare a couple child nodes here so only take data from node named loc
if (locNode.Name == "loc")
{
// get the content of the loc node
string loc = locNode.InnerText;
// write it to the console so you can see its working
Console.WriteLine(loc + Environment.NewLine);
// write it to the file
sw.Write(loc + Environment.NewLine);
}
}
}
}
catch { }
}
Console.WriteLine("All Done :-)");
Console.ReadLine();
}
static void readSitemap()
{
}
}
}
รหัสบน Paste Bin http://pastebin.com/yK7cSNeY
มีหลายวิธีบางอย่าง:
คุณสามารถใช้ชุดข้อมูลเพื่ออ่านสตริง XML
var xmlString = File.ReadAllText(FILE_PATH);
var stringReader = new StringReader(xmlString);
var dsSet = new DataSet();
dsSet.ReadXml(stringReader);
การโพสต์สิ่งนี้เพื่อประโยชน์ของข้อมูล
ลองดูคลาสXmlTextReader
public void ReadXmlFile()
{
string path = HttpContext.Current.Server.MapPath("~/App_Data"); // Finds the location of App_Data on server.
XmlTextReader reader = new XmlTextReader(System.IO.Path.Combine(path, "XMLFile7.xml")); //Combines the location of App_Data and the file name
while (reader.Read())
{
switch (reader.NodeType)
{
case XmlNodeType.Element:
break;
case XmlNodeType.Text:
columnNames.Add(reader.Value);
break;
case XmlNodeType.EndElement:
break;
}
}
}
คุณสามารถหลีกเลี่ยงคำสั่งแรกและเพียงระบุชื่อเส้นทางในตัวสร้างของ XmlTextReader
มีหลายวิธีขึ้นอยู่กับตำแหน่งที่คุณต้องการ XmlDocument เบากว่า XDocument แต่ถ้าคุณต้องการตรวจสอบว่าสตริงมี XML น้อยที่สุดการแสดงออกปกติอาจเป็นตัวเลือกที่เร็วและเบาที่สุดที่คุณสามารถทำได้ ตัวอย่างเช่นฉันได้ติดตั้ง Smoke Tests กับ SpecFlow สำหรับ API ของฉันและฉันต้องการทดสอบว่าผลลัพธ์ใดรายการหนึ่งใน XML ที่ถูกต้อง - จากนั้นฉันจะใช้นิพจน์ทั่วไป แต่ถ้าฉันต้องการแยกค่าจาก XML นี้ฉันจะแยกมันด้วย XDocument เพื่อทำมันให้เร็วขึ้นและใช้รหัสน้อยลง หรือฉันจะใช้ XmlDocument ถ้าฉันต้องทำงานกับ XML ขนาดใหญ่ (และบางครั้งฉันทำงานกับ XML ที่มีบรรทัดประมาณ 1M ยิ่งกว่านั้น); จากนั้นฉันก็สามารถอ่านทีละบรรทัด ทำไม? ลองเปิดมากกว่า 800MB ในไบต์ส่วนตัวใน Visual Studio แม้ในการผลิตคุณไม่ควรมีวัตถุที่ใหญ่กว่า 2GB คุณสามารถทำได้ด้วยการกระตุก แต่คุณไม่ควร หากคุณต้องแยกวิเคราะห์เอกสารซึ่งมีบรรทัดจำนวนมากเอกสารนี้อาจเป็น CSV
ฉันได้เขียนความคิดเห็นนี้เพราะฉันเห็นตัวอย่างของ XDocument XDocument ไม่ดีสำหรับเอกสารขนาดใหญ่หรือเมื่อคุณต้องการตรวจสอบว่ามีเนื้อหาที่ถูกต้อง XML หากคุณต้องการตรวจสอบว่า XML นั้นเหมาะสมหรือไม่คุณจำเป็นต้องมี Schema
ฉันยัง downvote คำตอบที่แนะนำเพราะฉันเชื่อว่ามันต้องการข้อมูลข้างต้นภายในตัวเอง ลองนึกภาพฉันต้องตรวจสอบว่า 200M ของ XML, 10 ครั้งต่อชั่วโมงเป็น XML ที่ถูกต้องหรือไม่ XDocument จะทำให้สิ้นเปลืองทรัพยากร
prasanna venkatesh ยังระบุว่าคุณสามารถลองเติมสตริงไปยังชุดข้อมูลก็จะระบุ XML ที่ถูกต้องเช่นกัน