Parsowanie XML 3-wiele atrybutów o takiej samej nazwie
listopad 7, 2007 — nyfiDziś w pracy miałem za zadanie wyciągnąć dane z dokumentu XML i zapisać je do tablicy longów. Dla naszego przykładu przyjmijmy, że miał postać:
<GlownyElement>
<Numer>1</Numer>
<Numer>2</Numer>
<Numer>3</Numer>
<Numer>4</Numer>
</GlownyElement>
Jak to sparsować? w poprzednich notkach przetwarzaliśmy dokumenty gdzie były pojedyncze elementy więc tamtych sposobów nie można zastosować, bo będziemy mieli tylko jeden element a potrzebujemy wszystkie. Można zastosować taki sposób, korzystając ze znanego nam Digestera.
Digester dig = new Digester();
dig.setValidating(false);
dig.addCallMethod(”*/Numer”, “add”, 1);
dig.addCallParam(”*/Numer”, 0);
List<String> list = new ArrayList<String>();
dig.push(list);
dig.parse(new StringReader(document));
long [] retar = new long[list.size()];
for(int i=0;i < list.size();i++){
retar[i] = Long.parseLong(list.get(i));
}
Pierwsze 2 linijki są nam znane, ale ciekawe rzeczy zaczynają się od kolejnej addCallMethod(”*/Numer”,”add”,1) oznacza to, że dla atrybutu */Numer wywołujemy metodę add a 1 to ilość paremetrów do przetworzenia czyli nasz Numer. Metoda addCallParam(”*/Numer”,0) mówi nam, że wartość elementu Numer będzie zapisywana na wierzchu stosu. Później jest tworzona lista stringów i wkładana na stos. Bardzo ważne aby to był string, bo jeśli damy inny typ to rzuci nam wyjątkiem. Kolejnym etapem jest parsowanie gdzie document to String z zawartością naszego dokumentu xml. Ostanie 3 linijki to utworzenie potrzebnej mi tablicy longów.