Her zaman XML'i işlemek için hantal buldum. Bir XML ayrıştırıcısı uygulamaktan bahsetmiyorum: XML düğümünü düğüm tarafından işleyen SAX ayrıştırıcısı gibi mevcut bir akış tabanlı ayrıştırıcıyı kullanmaktan bahsediyorum .
Evet, bu ayrıştırıcılar için çeşitli API'leri öğrenmek gerçekten kolay, ancak XML'i işleyen koda baktığımda her zaman biraz kıvrımlı buluyorum. Temel sorun, bir XML belgesinin mantıksal olarak tek tek düğümlere ayrılması gibi görünmektedir ve yine de veri türleri ve nitelikleri genellikle gerçek verilerden, bazen birden fazla iç içe yerleştirme düzeyiyle ayrılmaktadır. Bu nedenle, belirli bir düğümü tek tek işlerken, nerede olduğumuzu ve daha sonra ne yapmamız gerektiğini belirlemek için çok fazla ekstra durumun korunması gerekir.
Örneğin, tipik bir XML belgesinden bir snippet verildiğinde:
<book>
<title>Blah blah</title>
<author>Blah blah</author>
<price>15 USD</price>
</book>
... Kitap başlığı içeren bir metin düğümü ile karşılaştığımda nasıl belirleyebilirim? Her aradığımızda bize XML belgesinde bir sonraki düğümü veren, yineleyici gibi davranan basit bir XML ayrıştırıcımız olduğunu varsayalım XMLParser.getNextNode()
. Kaçınılmaz olarak kendimi aşağıdaki gibi kod yazma bulmak:
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;
}
}
}
Temel olarak, XML işleme, daha önce bulduğumuz üst düğümleri belirtmek için kullanılan çok sayıda durum değişkeni ile birlikte, büyük, durum-makine odaklı bir döngüye dönüşür. Aksi takdirde, tüm iç içe etiketlerin izlenmesi için bir yığın nesnesinin korunması gerekir. Bu hızla hataya açık hale gelir ve bakımı zorlaşır.
Yine, sorun, ilgilendiğimiz verilerin doğrudan tek bir düğümle ilişkili olmaması gibi görünüyor. Tabii ki, XML'i şöyle yazarsak:
<book title="Blah blah" author="blah blah" price="15 USD" />
... ama nadiren XML gerçekte böyle kullanılır. Çoğunlukla üst düğümlerin alt öğesi olarak metin düğümlerimiz vardır ve bir metin düğümünün ne anlama geldiğini belirlemek için üst düğümleri takip etmemiz gerekir.
Yani ... yanlış bir şey mi yapıyorum? Daha iyi bir yol var mı? XML akışı tabanlı bir ayrıştırıcı kullanmak hangi noktada çok hantal hale gelir, böylece tam teşekküllü bir DOM ayrıştırıcısı gerekli hale gelir? Akış tabanlı ayrıştırıcılarla XML işlerken diğer programcılardan ne tür deyimler kullandıklarını duymak istiyorum. Akış tabanlı XML ayrıştırma her zaman büyük bir durum makinesine dönüşmeli mi?