Mapowanie XML obiektów Java – JAXB

UWAGA, ruszył Humble Book Bundle na serię Cookbok wydawnictwa O'REILLY

http://www.iconarchive.com/show/senary-icons-by-arrioch/Internet-xml-icon.html

Podczas tworzenia oprogramowania na każdym kroku mamy kontakt z danymi w formacie XML. Opiszę tutaj jeden ze sposobów konwersji danych w obie strony Java <-> XML.

Ale na początek przyjrzyjmy się źródłom słynnego już kalkulatora wyborczego. Twórcy oprogramowania wykazali się dość ciekawym podejściem w generowaniu dokumentów XML, a dokładnie wykorzystali zwykłą konkatenację „stringów”:

Nietrudno można sobie wyobrazić co byłoby w przypadku bardziej skomplikowanej struktury zawierającej wiele węzłów podrzędnych i atrybutów. Programista prawdopodobnie niejednokrotnie pomylił się podczas zamykania znaczników (choćby przez „literówki”). Taki kod jest bardzo ciężki w utrzymaniu. Poza tym dokument będzie niemożliwy do odczytu, jeśli np. zmienna this.currentLwyb.Text zawierałaby jeden ze znaków predefiniowanych w XML encji: &, <, >, „, ‚.

Jest to przykład nierzadko spotykanych złych praktyk, a poniżej przestawię bardziej eleganckie rozwiązanie w Javie.

Biblioteka – JAXB

JAXB (Java Architecture for XML Binding) pozwala programistom wykonanie mapowania klas Java do ich reprezentacji w formacie XML

Biblioteka dostarcza takie funkcje jak:

  • marshalling – konwersja obiektu Java do formatu XML
  • unmarshalling – konwersja zawartości XML do obiektu Java

Wykorzystanie JAXB nie wymaga dołączania do projektu żadnych dodatkowych bibliotek jeżeli jest wykorzystywane JDK od wersji 6, ponieważ JAXB jest już w nim wbudowane.

Klasa i adnotacje

Klasy które chcemy wykorzystać do mapowania z XML muszą zawierać odpowiednie adnotacje JAXB. Dokładne informacje można znaleźć tutaj.

Niech za przykład elementu w XML posłużą dane kodu pocztowego z wcześniejszego artykułu:

Reprezentacja pozycji XML w klasie:

W kodzie powyżej zostały wykorzystane adnotacje JAXB:

  • @XmlRootElement, gdzie został ustawiony parametr „name” nadpisujący domyślną wartość nazwy atrybutu „postCode” na „pozycja”.
  • @XmlAttribute, gdzie również zostały ustawione parametry „name” nadpisujące domyślne wartości atrybutów.

 

Konwersja obiektu do XML

Wynik:

 

Konwersja XML do obiektu

Wynik:

 

Rozszerzenie o listę elementów

Należy utworzyć nową klasę zawierającą listę obiektów PostCode.

W kodzie powyżej doszła kolejna adnotacja:

  • @XmlElements – kontenter elementów @XmlElement.

 

Java -> XML

Wcześniej dodałem konstruktory w klasie PostCode:

 

Wynik:

 

XML -> Java

Wynik:

Szybko i elegancko.


Przykład zastosowania – wybory samorządowe 2014

Na zakończenie definicje klas do parsowania dokumentu XML zawierającego dane osób komisji wyborczych wyborów samorządowych w 2014 roku. Klasy zostały wykorzystane do importów danych z Państwowej Komisji Wyborczej, a statystyki można zobaczyć tutaj.

  1. Plik XML (zmienione dane osobowe)

     
  2. Reprezentacja osoby

     
  3. Reprezentacja całej komisji

     

 

UWAGA, ruszył Humble Book Bundle na serię Cookbok wydawnictwa O'REILLY

To również może Cię zainteresować:

  • Wybory samorządowe 2014 – dane osób z komisji wyborczychWybory samorządowe 2014 – dane osób z komisji wyborczych Pod tym adresem umieszczone są były dane pochodzące ze wszystkich obwodów wyborczych. Wykonałem w Javie program, który pobrał informacje na temat wszystkich osób pracujących w komisjach […]
  • Java i listing wszystkich plików w kataloguJava i listing wszystkich plików w katalogu W ostatnim czasie musiałem przerobić jeden z systemów na wersję wielojęzykową. Chodziło dokładnie o to, aby wszystkie Stringi zostały wywołane przez tzw. wrapper ze wstrzyknięciem pewnego […]
  • Java JNA #2, Total CommanderJava JNA #2, Total Commander W poprzednim wpisie zrobiłem krótkie wprowadzenie do wykorzystywania biblioteki user32.dll przez Javę do pobierania informacji z innych aplikacji okienkowych. Poniżej rozszerzymy nasze […]
  • Arduino – zdalne sterowanie oświetleniemArduino – zdalne sterowanie oświetleniem W tym artykule opiszę sposób wykonania zdalnego sterowania jednym urządzeniem wpinanym do gniazdka 230V z wykorzystaniem Arduino. Wykorzystane będzie połączenie przez USB z komputerem, […]
  • Fundamenty języka JavaFundamenty języka Java Niecały miesiąc temu zostałem poproszony przez Strefę Kursów o ocenę ich nowo wydanego materiału dla osób chcących zacząć naukę programowania w Javie: "Fundamenty języka Java". Przerobiłem […]
  • Java vs Kotlin! A Ty, co wybierasz?Java vs Kotlin! A Ty, co wybierasz? Pragniesz poznać najnowsze trendy w Javie albo zastanawiasz się co posiada Kotlin czego nie ma Java? A może chcesz dowiedzieć się w jaki sposób użyć Kotlina do rozwiązywania codziennych […]

Dodaj komentarz