Saya selalu menemukan XML agak rumit untuk diproses. Saya tidak berbicara tentang menerapkan parser XML: Saya berbicara tentang menggunakan parser berbasis aliran yang ada, seperti parser SAX, yang memproses XML node demi node.
Ya, sangat mudah untuk mempelajari berbagai API untuk parser ini, tetapi setiap kali saya melihat kode yang memproses XML saya selalu merasa agak berbelit-belit. Masalah mendasar tampaknya adalah bahwa dokumen XML secara logis dipisahkan menjadi node individual, namun tipe data dan atributnya sering dipisahkan dari data aktual, kadang-kadang oleh beberapa tingkat sarang. Oleh karena itu, ketika memproses node tertentu secara individual, banyak kondisi tambahan perlu dipertahankan untuk menentukan di mana kita berada dan apa yang perlu kita lakukan selanjutnya.
Misalnya, diberi potongan dari dokumen XML khas:
<book>
<title>Blah blah</title>
<author>Blah blah</author>
<price>15 USD</price>
</book>
... Bagaimana saya menentukan kapan saya menemukan simpul teks yang berisi judul buku? Misalkan kita memiliki parser XML sederhana yang bertindak seperti iterator, memberi kita simpul berikutnya dalam dokumen XML setiap kali kita memanggil XMLParser.getNextNode()
. Saya pasti menemukan diri saya menulis kode seperti berikut:
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;
}
}
}
Pada dasarnya, pemrosesan XML dengan cepat berubah menjadi loop besar yang digerakkan oleh mesin negara, dengan banyak variabel status yang digunakan untuk menunjukkan node induk yang kami temukan sebelumnya. Jika tidak, objek tumpukan harus dipertahankan untuk melacak semua tag yang disarangkan. Ini dengan cepat menjadi rawan kesalahan dan sulit untuk dipertahankan.
Sekali lagi, masalahnya adalah bahwa data yang kami minati tidak terkait langsung dengan satu node. Tentu, bisa jadi, jika kita menulis XML seperti:
<book title="Blah blah" author="blah blah" price="15 USD" />
... tapi ini jarang bagaimana XML digunakan dalam kenyataan. Sebagian besar kita memiliki simpul teks sebagai anak-anak dari simpul induk, dan kita perlu melacak simpul induk untuk menentukan apa yang dimaksud dengan simpul teks.
Jadi ... apakah saya melakukan sesuatu yang salah? Apakah ada cara yang lebih baik? Pada titik apakah menggunakan parser berbasis aliran XML menjadi terlalu rumit, sehingga parser DOM yang lengkap menjadi perlu? Saya ingin mendengar dari programmer lain idiom apa yang mereka gunakan saat memproses XML dengan parser berbasis aliran. Haruskah parsing XML berbasis aliran selalu berubah menjadi mesin negara yang besar?