ฉันพบว่า XML ค่อนข้างยุ่งยากในการประมวลผลเสมอ ฉันไม่ได้พูดเกี่ยวกับการใช้งานตัวแยกวิเคราะห์ XML: ฉันกำลังพูดถึงการใช้ตัวแยกวิเคราะห์ที่ใช้กระแสอยู่เช่น SAX parser ซึ่งประมวลผลโหนด XML โดยโหนด
ใช่มันง่ายมากที่จะเรียนรู้ API ต่างๆสำหรับ parsers เหล่านี้ แต่เมื่อใดก็ตามที่ฉันดูโค้ดที่ประมวลผล XML ฉันมักจะพบว่ามันค่อนข้างซับซ้อน ปัญหาที่สำคัญดูเหมือนว่าเอกสาร XML จะถูกแยกออกเป็นส่วน ๆ อย่างมีเหตุผลและแต่ละประเภทข้อมูลและคุณลักษณะมักจะแยกออกจากข้อมูลจริงบางครั้งโดยการซ้อนหลายระดับ ดังนั้นเมื่อประมวลผลโหนดเฉพาะใด ๆ เป็นรายบุคคลจำเป็นต้องมีสถานะพิเศษจำนวนมากเพื่อกำหนดว่าเราอยู่ที่ไหนและต้องทำอะไรต่อไป
ตัวอย่างเช่นให้ข้อมูลโค้ดจากเอกสาร XML ทั่วไป:
<book>
<title>Blah blah</title>
<author>Blah blah</author>
<price>15 USD</price>
</book>
... ฉันจะทราบได้อย่างไรเมื่อพบโหนดข้อความที่มีชื่อหนังสือ สมมติว่าเรามีตัวแยกวิเคราะห์ XML ง่ายซึ่งทำหน้าที่เหมือน iterator ให้เราโหนดถัดไปในเอกสาร XML XMLParser.getNextNode()
โทรทุกครั้งที่เรา ฉันพบว่าตัวเองเขียนโค้ดอย่างหลีกเลี่ยงไม่ได้:
boolean insideBookNode = false;
boolean insideTitleNode = false;
while (!XMLParser.finished())
{
....
XMLNode n = XMLParser.getNextNode();
if (n.type() == XMLTextNode)
{
if (insideBookNode && insideTitleNode)
{
// We have a book title, so do something with it
}
}
else
{
if (n.type() == XMLStartTag)
{
if (n.name().equals("book")) insideBookNode = true
else if (n.name().equals("title")) insideTitleNode = true;
}
else if (n.type() == XMLEndTag)
{
if (n.name().equals("book")) insideBookNode = false;
else if (n.name().equals("title")) insideTitleNode = false;
}
}
}
โดยทั่วไปการประมวลผล XML จะเปลี่ยนเป็นลูปที่ขับเคลื่อนด้วยเครื่องจักรขนาดใหญ่ได้อย่างรวดเร็วพร้อมด้วยตัวแปรสถานะจำนวนมากที่ใช้เพื่อระบุโหนดพาเรนต์ที่เราพบก่อนหน้านี้ มิเช่นนั้นวัตถุสแต็กจำเป็นต้องได้รับการดูแลเพื่อติดตามแท็กที่ซ้อนกันทั้งหมด สิ่งนี้จะกลายเป็นข้อผิดพลาดได้ง่ายและบำรุงรักษาได้ยาก
อีกครั้งปัญหาดูเหมือนว่าข้อมูลที่เราสนใจไม่ได้เชื่อมโยงโดยตรงกับแต่ละโหนด แน่นอนว่าอาจเป็นไปได้ถ้าเราเขียน XML เช่น:
<book title="Blah blah" author="blah blah" price="15 USD" />
... แต่นี่ไม่ค่อยเป็นวิธีการใช้ XML ในความเป็นจริง ส่วนใหญ่เรามีโหนดข้อความเป็นลูกของโหนดพาเรนต์และเราจำเป็นต้องติดตามโหนดหลักเพื่อกำหนดว่าโหนดข้อความหมายถึงอะไร
ดังนั้น ... ฉันกำลังทำอะไรผิดหรือเปล่า? มีวิธีที่ดีกว่า? ตัวแยกวิเคราะห์ XML ที่ใช้ในจุดใดที่ยุ่งยากเกินไปดังนั้นตัวแยกวิเคราะห์ DOM ที่มีการแปลงเต็มจึงจำเป็น? ฉันต้องการได้ยินจากโปรแกรมเมอร์คนอื่น ๆ ว่าพวกเขาใช้สำนวนแบบไหนเมื่อประมวลผล XML ด้วยตัวแยกวิเคราะห์ที่ใช้สตรีม ต้องมีการแยกวิเคราะห์ XML ตามกระแสกลายเป็นเครื่องรัฐขนาดใหญ่หรือไม่