zakladam ze struktura pliku XML jest Ci znana, jest sztywna i ze zakladasz ze plik XML jest poprawny.
-
w plikach XML znaki < oraz > maja prawo wystepowac tylko i wylacznie jako ograniczniki tagaow, w wartosciach atrybutow oraz sekcjacj CDATA (porpawcie mnie jesli nie) musza zostac zamienione na encje < oraz >, odpowiednio. To znaczy, ze mozesz w bardzo prosty sposob wykrywac poczatki i konce tagow: po prostu sprawdzaj czy na danej pozycji jest <litera albo <\litera
-
maja prawo istniec tagi krotkie, nie zakanczane <\tag> -- sa to <tag />, trzeba to miec w pamieci i kazdy zauwazony nowy tag sprawdzac czy nie konczy sie on />
-
poprawnie skonstruowany XML ma zbalansowane tagi: kazdy tag otwarty ma zamkniecie, z uwaga na punkt 2. To znaczy, ze mozesz latwo orientowac sie co jest zawartoscia danego taga poprzez albo pracę stosową z pamietaniem gdzie-teraz-jestem, albo prace z look-ahead'em i zliczaniem wystapien samego siebie.
omawianie stosu sobie daruje, bo jest tego pelno. Natomiast, jesli Twoj XML jest prosty i nierozbudowany, mozesz sprobowac podgladactwa-w-przód. Majac XML:
...
.< - tu aktualnie 'jestes' z ogladaniem pliku
<BLAH>
<BUM>
<BLAH>
<BLAH />
</BLAH>
</BLAH>
...
mozesz w prosty sposob dowiedziec sie, gdzie Twoj obecnie widziany tag 'BLAH' sie konczy: przegladasz znaki w przod (lookahead) i obserwujesz czy pojawia sie takie (regexp..):
<BLAH
<BLAH[^/>]*/>
</BLAH\s+>
jezeli pojawi sie pierwszy, to znaczy ze w Twoim tagu jest inny taki. Zapamietaj ile bylo takich.
jezeli pojawi sie drugi -- olej. to jest krotki tag, on niczego nie wnosi do probelmu startu-konca
jezeli pojawi sie trzeci - o, cos zostalo zamkniete. albo Twoj tag, albo jeden z wewnetrznych. Jezeli liczba zamkniec = liczba widzianych wewnetrznych+1 ----- to znaczy, ze To Twoje zamkniecie, voil'a -- znalazlem koniec!
- umiejac znalezc swoj poczatek i koniec swojego taga, mozesz teraz obejrzec jego wnetrze. Analogicznie, tylko z innym tagiem, nie BLAH tylko inny. Jak bedziesz mial kod ogladajacy w ten sposob wszystko, az do "dna" - to na dnie okaze sie ze bedziesz mial kod, ktory oglada wnetrza tekstowe -- wystarczy je skopiowac do swoich struktur w pamieci --- albo ktory oglada atrybuty tagow -- wystarczy je skopiowac..
natomiast, jezeli potrafisz poslugiwac sie stosem, zacznij od tego rekurencyjnie:
idz w przod, ogladaj znaki. <litera oznacza nowy tag, wez jego nazwe, jezeli ten tag nie konczy sie znakami /> to wrzuc nazwe na stos. <\litera oznacza zamkniecie taga, zdejmij tego taga ze stosu. jesli nazwa sie nie zgadza z nazwa na stosie - blad, plik lub Twoj kod jest walniety.
takie cos jest w stanie przejsc po calym XMLu trafiajac we wszystko lub przeskakujac text luzno latajacy. W taka ramowke wcisniesz sprawdzanie czy znaleziony tagname==BLAH albo czy "teraz leci luzny tekst" i na podstawie nazwy taga lezacej na czubku stosu, bedziesz wiedzial czy cos robic ze znaleziona zawartoscia, czy tez nic i leciec dalej
wzgledem bibliotek xerces, expat, czy msxml czy innych -- reczne podejscie ma ten minus, ze nie bedziesz mial walidacji xsd, obslugi namespacow, obslugi(....) - chyba ze sam napiszesz..