Parsowanie XML

0

Muszę przetworzyć plik XML, który pod pewnym względem jest wadliwy i jego budowa jest następująca (przykład):

<osoby><osoba>
<wiek>18</wiek>
<plec>mezczyzna</wiek>
Jan Kowalski
</osoba></osoby>

Oczywiście struktura XML jest zdecydowanie bardziej skomplikowana, ale ten prosty przykład doskonale pokazuje sedno mojego problemu - mianowicie jak wydobyć imię i nazwisko (Jan Kowalski) z takiej struktury, skoro brakuje tagu w stylu <nazwisko>Jan Kowalski</nazwisko ?

Początkowo do parsowania korzystałem biblioteki XML2Dict, która jest niesamowicie wygodna dla programisty (łatwo i wygodnie jest operować na słowniku), ale po zmapowaniu XML na słownik wartość "Jan Kowalski" była niedwracanie tracona (XML2Dict nie wiedział jak z tym postępować).

W xml.dom.minidom też nie doszukałem się funkcji, która pozwoliłaby taką wartość wyciągnąć.
Jedyne co przyszło mi do głowy, to wydobyć węzeł osoba:

<osoba> <wiek>18</wiek> <plec>mezczyzna</wiek> Jan Kowalski </osoba>

i tutaj już ręcznie sparsować to jak zwykły String. Czyli szukam domknięcia </wiek> i </osoba>, a potem wartość między nimi traktuję jak interesującą mnie wartość.
Ale jest to dość mało efektywne, a eleganckie to już w ogóle.
Zależy mi na efektywności, bo plik XML będzie parsowany co minutę, a jest dość pokaźnych rozmiarów.

Czy ma ktoś pomysł na rozwiązanie tego problemu?

0

Jeśli tam jest błąd i miało być <plec></plec> to ten XML nie jest wadliwy, a po prostu ma węzeł tekstowy obok swoich kolegów, bezpośrednio w węźle <osoba>.
Jeśli masz bibliotekę implementującą DOM to wystarczy dobrać się do wartości ostatniego dziecka węzła osoba.

Coś w rodzaju $xml.GetElementsByTagName("osoba")[0].LastChild.Value - metody i właściwości DOMDocument są standardowe pomiędzy językami programowania.

0

Jezeli rzeczywiscie moze sie zdarzyc cos takiego: <plec>mezczyzna</wiek> To mozesz po prostu przejechac wszystkie linie regexpem (<\w*>)(.*)(</\w*>) i sprawdzic czy $1 i $3(czyli pierwsza i trzecia grupa) otwieraja i zamykaja ten sam tag(zwykle porownanie ostatnich dlugosc-2 znakow wystarczy). Jezeli beda takie same to ta linjka jest ok, jezeli nie to mamy bledna linijke albo tenkst ktory jest luzem(czyli w sumie to co Cie interesuje).

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.