การแปลง StreamReader เป็น XmlReader ใน .Net 2.0/C#

ในโลกของการเขียนโปรแกรม .NET การทำงานกับไฟล์ XML เป็นงานที่พบบ่อย โดยเฉพาะเมื่อมีการจัดการกับชุดข้อมูล หากคุณเคยพยายามแปลง StreamReader เป็น XmlReader แล้วพบเจอกับปัญหา คุณไม่ได้อยู่คนเดียว

ในบล็อกโพสต์นี้ เราจะทำการวิเคราะห์ปัญหาที่มักเกิดขึ้นในระหว่างการแปลงนี้และสำรวจวิธีการแก้ไขอย่างมีประสิทธิภาพ

ปัญหา

คุณกำลังพยายามแปลง .NET DataSet เป็นสตรีม XML ใช้การแปลง XSL ในหน่วยความจำ และเขียน XML ที่ปรับปรุงแล้วไปยังไฟล์ใหม่ อย่างไรก็ตาม ปัญหาจะเกิดขึ้นเมื่อสร้าง XmlReader จาก StreamReader ซึ่งดูเหมือนจะไม่มีข้อมูล

นี่คือการสรุปสั้นๆ ของโค้ดที่คุณพยายามใช้:

BufferedStream stream = new BufferedStream(new MemoryStream());
DataSet ds = new DataSet();
da.Fill(ds);
ds.WriteXml(stream);

StreamReader sr = new StreamReader(stream, true);
stream.Position = 0; // รีเซ็ตตำแหน่งสำหรับการอ่าน

XmlReader reader = XmlReader.Create(sr, null); // ปัญหาเกิดขึ้นที่นี่

ปัญหาหลักคือ XmlReader ที่ถูกสร้างไม่สามารถรู้จักข้อมูลจาก StreamReader

การเข้าใจสาเหตุ

ปัญหาหลักที่สังเกตได้ในโค้ด:

  • การตั้งตำแหน่งของสตรีม: ตำแหน่งของสตรีมต้องถูกรีเซ็ตเพื่อให้ StreamReader สามารถอ่านจากจุดเริ่มต้นของสตรีมได้
  • การปิดสตรีม: การจัดการกับสตรีมอย่างเหมาะสม รวมถึงการปิดหรือการ flush หลังจากการเขียน เป็นสิ่งสำคัญสำหรับความถูกต้องของข้อมูล

วิธิการแก้ไข

นี่คือแนวทางที่ตรงไปตรงมาในการแก้ไขปัญหากับโค้ดที่มีอยู่ของคุณ:

ขั้นตอนที่ 1: รีเซ็ตตำแหน่งของสตรีม

ก่อนที่จะอ่านจาก StreamReader ให้ตรวจสอบว่าตำแหน่งของ BufferedStream ถูกรีเซ็ตแล้ว ซึ่งสามารถทำได้ด้วยวิธี Seek หรือการตั้งค่าคุณสมบัติ Position โดยตรง

ขั้นตอนที่ 2: สร้าง XmlReader อย่างถูกต้อง

สร้าง XmlReader ใหม่หลังจากที่แน่ใจว่าสตรีมถูกตั้งค่าตำแหน่งอย่างเหมาะสมไปยังจุดเริ่มต้น

ขั้นตอนที่ 3: นำโค้ดที่ทำงานไปใช้งาน

ต่อไปนี้เป็นตัวอย่างการทำงานที่จะแสดงวิธีการดำเนินการเหล่านี้:

BufferedStream stream = new BufferedStream(new MemoryStream());
stream.Write(Encoding.ASCII.GetBytes("<xml>foo</xml>"), 0, "<xml>foo</xml>".Length);
stream.Seek(0, SeekOrigin.Begin); // สำคัญ: รีเซ็ตตำแหน่งของสตรีม

using (StreamReader sr = new StreamReader(stream))
{
    using (XmlReader reader = XmlReader.Create(sr))
    {
        while (reader.Read())
        {
            Console.WriteLine(reader.Value);
        }
    }
}

คำอธิบายของโค้ด:

  • การเขียนลงสตรีม: ที่นี่เรากำลังเขียนโครงสร้าง XML ที่เรียบง่ายลงในสตรีม
  • การรีเซ็ตตำแหน่ง: โดยใช้ Seek(0, SeekOrigin.Begin) เราจะมั่นใจได้ว่าเครื่องอ่านสตรีมของเราจะเริ่มต้นจากจุดเริ่มต้น
  • การอ่านด้วย XmlReader: XmlReader.Create(sr) จะอ่าน XML และเราสามารถแสดงเนื้อหาของมันได้

สรุป

โดยการมั่นใจว่ามีการจัดการสตรีมอย่างเหมาะสมและรีเซ็ตไปยังตำแหน่งที่ถูกต้อง คุณจะสามารถหลีกเลี่ยงข้อผิดพลาดที่เกิดขึ้นเมื่อแปลง StreamReader เป็น XmlReader ใน .Net 2.0/C# การจัดการ XML ใน .NET สามารถทำได้ง่าย หากเราสังเกตการจัดการสตรีมของเราอย่างใกล้ชิด

นำการเปลี่ยนแปลงเหล่านี้ไปใช้งาน และคุณควรเห็นการปรับปรุงอย่างชัดเจนในความสามารถในการจัดการ XML ของคุณ!