สร้างไฟล์ XML จาก Object ใน C#

สร้างไฟล์ XML จาก Object ใน C#

เริ่มจากการเตรียม Class

    [Serializable]
    [XmlRoot("PeopleData")]
    public class People
    {
        [XmlArray("UserList")]
        [XmlArrayItem("User")]
        public List<Person> PersonList { get; set; }

        public People()
        {
            PersonList = new List<Person>();
        }
    }
    [Serializable]
    public class Person
    {
        [XmlElement("FullName")]
        public string Name { get; set; }

        [XmlElement("CurrentAge")]
        public int Age { get; set; }

        [XmlAttribute("ID")]
        public int Id { get; set; }

        [XmlArray("Hobbies")]
        [XmlArrayItem("Hobby")]
        public List<string> Hobbies { get; set; }

        public Person() 
        {
            Hobbies = new List<string>();
        }
    }

สร้าง Object – ใส่ค่าลงใน Object

    public static class XmlHelper
    {
        public static void ExportToXml<T>(T data, string filePath)
        {
            try
            {
                XmlSerializer serializer = new XmlSerializer(typeof(T));
                using (StreamWriter writer = new StreamWriter(filePath, false, Encoding.UTF8))
                {
                    serializer.Serialize(writer, data);
                }
                Console.WriteLine($"Export ข้อมูลไปที่ '{filePath}' สำเร็จ");
            }
            catch (Exception ex)
            {
                Console.WriteLine($"เกิดข้อผิดพลาดระหว่าง Export: {ex.Message}");
            }
        }

Export เป็น XML

    class Program
    {
        static void Main(string[] args)
        {
            string xmlFilePath = "data.xml";
            
            var peopleData = new People();
            peopleData.PersonList.Add(new Person { Id = 1, Name = "สมชาย ใจดี", Age = 30, Hobbies = new List<string> { "อ่านหนังสือ" } });
            peopleData.PersonList.Add(new Person { Id = 2, Name = "สมหญิง จริงใจ", Age = 25, Hobbies = new List<string> { "ฟังเพลง", "วิ่ง" } });
            XmlHelper.ExportToXml(peopleData, xmlFilePath);
            Console.WriteLine("\n-----------------------------------\n");
        }
    }
<?xml version="1.0" encoding="utf-8"?>
<PeopleData xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <UserList>
    <User ID="1">
      <FullName>สมชาย ใจดี</FullName>
      <CurrentAge>30</CurrentAge>
      <Hobbies>
        <Hobby>อ่านหนังสือ</Hobby>
      </Hobbies>
    </User>
    <User ID="2">
      <FullName>สมหญิง จริงใจ</FullName>
      <CurrentAge>25</CurrentAge>
      <Hobbies>
        <Hobby>ฟังเพลง</Hobby>
        <Hobby>วิ่ง</Hobby>
      </Hobbies>
    </User>
  </UserList>
</PeopleData>

ถ้าเราต้องการอ่านกลับมาใช้งาน

/// <summary>
/// Import ข้อมูลจากไฟล์ XML พร้อม Validate กับ XSD (ถ้ามี)
/// </summary>
/// <param name="xsdPath">Path ของไฟล์ XSD (ถ้าเป็น null จะไม่ทำการ Validate)</param>
public static T ImportFromXml<T>(string filePath, string xsdPath)
{
    if (!File.Exists(filePath))
    {
        throw new FileNotFoundException("ไม่พบไฟล์ XML ที่ระบุ", filePath);
    }

    // ตัวแปรสำหรับเก็บข้อผิดพลาดจากการ Validate
    var validationErrors = new List<string>();

    try
    {
        // --- ส่วนของการตั้งค่า Validation ---
        var settings = new XmlReaderSettings();
        if (!string.IsNullOrEmpty(xsdPath))
        {
            if (!File.Exists(xsdPath))
            {
                throw new FileNotFoundException("ไม่พบไฟล์ XSD ที่ระบุ", xsdPath);
            }

            // เพิ่ม Schema เข้าไปในการตั้งค่า
            settings.Schemas.Add(null, xsdPath); // targetNamespace = null
            settings.ValidationType = ValidationType.Schema;

            // สร้าง Event Handler เพื่อดักจับ Error ตอน Validate
            settings.ValidationEventHandler += (sender, args) =>
            {
                if (args.Severity == XmlSeverityType.Error)
                {
                    validationErrors.Add($"บรรทัดที่ {args.Exception.LineNumber}, ตำแหน่งที่ {args.Exception.LinePosition}: {args.Message}");
                }
            };
        }

        // --- ทำการอ่านและ Deserialize ---
        using (XmlReader reader = XmlReader.Create(filePath, settings))
        {
            XmlSerializer serializer = new XmlSerializer(typeof(T));
            T result = (T)serializer.Deserialize(reader);

            // หลังจาก Deserialize เสร็จ, ตรวจสอบว่ามี Error หรือไม่
            if (validationErrors.Count > 0)
            {
                throw new XmlSchemaValidationException("ไฟล์ XML ไม่ถูกต้องตาม Schema:\n" + string.Join("\n", validationErrors));
            }

            return result;
        }
    }
    catch (Exception ex)
    {
        Console.WriteLine($"เกิดข้อผิดพลาดระหว่าง Import: {ex.Message}");
        return default(T);
    }
}

ในกรณีที่มี XSD ด้วย เราสามารถส่งให้มัน validate ได้ด้วย

Console.WriteLine($"--- ทดสอบ Import '{xmlFilePath}' (ไฟล์ถูกต้อง) พร้อม Validate กับ XSD ---");
People importedData = XmlHelper.ImportFromXml<People>(xmlFilePath, xsdFilePath);
if (importedData != null)
{
    Console.WriteLine("Import และ Validate สำเร็จ! ข้อมูลถูกต้องตาม Schema");
    foreach (var person in importedData.PersonList)
    {
        Console.WriteLine($"  - ID: {person.Id}, ชื่อ: {person.Name}, อายุ: {person.Age}");
    }
}

Comments

No comments yet. Why don’t you start the discussion?

Leave a Reply

Your email address will not be published. Required fields are marked *