Mam gigantyczny plik schematu .XSD SDK programu QuickBooks, który definiuje żądania / odpowiedzi XML, które mogę wysyłać / odbierać z programu QuickBooks.
Chciałbym mieć możliwość łatwego generowania klas Java z tych plików .XSD, których mógłbym następnie użyć do kierowania XML do obiektów Java, a obiektów Java do XML.
Czy jest na to łatwy sposób ...?
Idealnie byłoby, gdyby nie wymagał żadnych bibliotek zewnętrznych w stosunku do podstawowej dystrybucji Java w czasie wykonywania. Ale jestem elastyczny ...
Odpowiedzi:
JAXB robi DOKŁADNIE to, co chcesz. Jest wbudowany w JRE / JDK począwszy od wersji 1.6
źródło
Aby rozwinąć powyższe komentarze „użyj JAXB”,
W systemie Windows
"%java_home%\bin\xjc" -p [your namespace] [xsd_file].xsd
na przykład,
"%java_home%\bin\xjc" -p com.mycompany.quickbooks.obj quickbooks.xsd
Poczekaj chwilę, a jeśli masz dobrze sformułowany plik XSD, otrzymasz kilka dobrze sformułowanych klas Java
źródło
Jeśli chcesz rozpocząć kodowanie Java do XML i XML do Java w mniej niż 5 minut, wypróbuj Simple XML Serialization. Nie trać godzin na naukę interfejsu API JAXB http://simple.sourceforge.net/download/stream/doc/tutorial/tutorial.php
Jeśli jednak naprawdę chcesz nauczyć się JAXB, oto doskonały samouczek http://blogs.oracle.com/teera/entry/jaxb_for_simple_java_xml
Zawartość poradnika:
JAXB do prostej serializacji Java-XML
Istnieje wiele sposobów serializacji XML w Javie. Jeśli chcesz dokładniejszej kontroli nad analizowaniem i serializacją, możesz wybrać SAX, DOM lub Stax, aby uzyskać lepszą wydajność. Jednak to, co często chcę robić, to proste mapowanie między POJO i XML. Jednak tworzenie klas Java do ręcznego analizowania zdarzeń XML nie jest trywialne. Niedawno odkryłem, że JAXB to szybkie i wygodne mapowanie lub serializacja Java-XML.
JAXB zawiera wiele przydatnych funkcji, możesz sprawdzić implementację referencyjną tutaj. Blog Kohsuke jest również dobrym źródłem informacji o JAXB. W tym wpisie na blogu pokażę, jak wykonać prostą serializację Java-XML za pomocą JAXB.
POJO do XML
Powiedzmy, że mam obiekt Java Item. Chcę serializować obiekt Item do formatu XML. Najpierw muszę dodać do tego POJO kilka adnotacji XML z pakietu javax.xml.bind.annotation. *. Zobacz listę kodu 1 dla Item.java
Z kodu
@XmlRootElement(name="Item")
wskazuje, że chcę być elementem głównym.@XmlType(propOrder = {"name", "price"})
wskazuje kolejność, w jakiej chcę, aby element był ułożony w danych wyjściowych XML.@XmlAttribute(name="id", ...)
wskazuje, że id jest atrybutem elementu głównego.@XmlElement(....)
wskazuje, że chcę, aby cena i nazwa były elementem elementu.Mój
Item.java
jest gotowy. Mogę wtedy przejść dalej i utworzyć skrypt JAXB do organizowania elementu.Aby uzyskać pełną listę kodów, zobacz Listing 2
main.java
. Powstajeitem.xml
plik wyjściowy z listą kodów 3 . To wygląda tak:Łatwe, prawda? Możesz alternatywnie skierować wyjściowy kod XML jako tekst String, Stream, Writer, ContentHandler itp., Po prostu zmieniając parametr metody marshal (...), takiej jak
XML do POJO
Odwróćmy ten proces. Załóżmy, że mam teraz fragment danych ciągu XML i chcę przekształcić go w obiekt Item.java. Wyglądają jak dane XML (lista kodu 3)
Następnie mogę cofnąć ten kod XML do obiektu Item przez
Pełną listę kodów można znaleźć na liście kodów 2 (main.java). Źródło XML może przybierać różne formy, zarówno ze strumienia, jak iz pliku. Jedyną różnicą jest ponownie parametr metody:
Walidacja za pomocą schematu XML
Ostatnią rzeczą, o której chcę tutaj wspomnieć, jest walidacja wejściowego XML ze schematem przed cofnięciem korekty do obiektu Java. Tworzę plik schematu XML o nazwie item.xsd. Aby uzyskać pełną listę kodów, zobacz Listing 4 (Item.xsd). Teraz muszę zarejestrować ten schemat do walidacji.
Kiedy próbuję odszukać dane XML do POJO, jeśli wejściowy XML nie jest zgodny ze schematem, zostanie przechwycony wyjątek. Aby uzyskać pełną listę kodów, zobacz Listing 5 (invalid_item.xml).
Tutaj zmieniam atrybut „id” na ciąg znaków zamiast liczby całkowitej.
Jeśli dane wejściowe XML są zgodne ze schematem, dane XML zostaną pomyślnie cofnięte do obiektu Item.java.
źródło
Korzystanie z Eclipse IDE: -
źródło
najłatwiej jest użyć wiersza poleceń. Po prostu wpisz katalog swojego pliku .xsd:
Więc java wygeneruje wszystkie Pojos.
źródło
Do tego celu można użyć Mavena, musisz dodać zależności i po prostu wyczyścić aplikację. Otrzymasz wszystkie klasy utworzone automatycznie w folderze docelowym.
Po prostu skopiuj je z miejsca docelowego do żądanego miejsca, oto pom.xml, którego użyłem do stworzenia sklasyfikowanych z plików xsd:
Po prostu umieść swoje pliki xsd w "src / main / webapp / schemas /", a maven znajdzie je w czasie kompilacji.
Mam nadzieję, że to Ci pomoże. Więcej informacji można znaleźć pod adresem http://www.beingjavaguys.com/2013/04/create-spring-web-services-using-maven.html
Mam nadzieję, że to pomoże :)
źródło
No XSD files found. Please check your plugin configuration.
XMLBeans to zrobi. W szczególności polecenie „scomp”.
EDYCJA: XMLBeans został wycofany , sprawdź ten post dotyczący stackoverflow, aby uzyskać więcej informacji.
źródło
Cóż, najlepszą opcją jest
%java_home%\bin\xjc -p [your namespace] [xsd_file].xsd
.Mam też pytanie, czy mamy tutaj możliwość wykonania inżynierii odwrotnej. jeśli tak, czy możemy wygenerować xsd z klasy pojo?
źródło
Jeśli nie masz nic przeciwko korzystaniu z zewnętrznej biblioteki, używałem do tego Castor w przeszłości.
źródło
Ograniczenie JAXB.
Pracowałem nad JAXB, moim zdaniem jest to niezły sposób radzenia sobie z danymi pomiędzy obiektami XML i Java. Pozytywne strony to sprawdzona i lepsza wydajność i kontrola nad danymi w czasie wykonywania. Przy dobrym wykorzystaniu wbudowanych narzędzi lub skryptów zajmie to dużo pracy związanej z kodowaniem.
Odkryłem, że część konfiguracyjna nie jest od razu zadaniem i spędziłem godziny na przygotowywaniu konfiguracji środowiska programistycznego.
Jednak porzuciłem to rozwiązanie z powodu głupiego ograniczenia, z którym się spotkałem. Moja definicja schematu XML (XSD) ma atrybut / element o nazwie „wartość” i muszę używać XSD w obecnej postaci. To bardzo małe ograniczenie zmusiło mój krok wiązania XJC nie powiódł się z błędem „Wartość właściwości” już użyta. "
Wynika to z implementacji JAXB, proces wiązania próbuje utworzyć obiekty Java z XSD, dodając kilka atrybutów do każdej klasy, a jeden z nich jest atrybutem wartości. Podczas przetwarzania mojego XSD skarżył się, że istnieje już właściwość o tej nazwie.
źródło
Czy XJC JAXB nie jest możliwą odpowiedzią na to? Próbuję osiągnąć to samo. Jednak wciąż w fazie „próbowania”. Przeszedłem przez XJC, więc pomyśl o udostępnieniu.
źródło
Dobrze znany JAXB
Istnieje wtyczka maven która może zrobić to za Ciebie na dowolnym etapie kompilacji.
Możesz to zrobić na dwa sposoby: xsd <-> Java
źródło
Mówiąc o ograniczeniu JAXB, rozwiązaniem w przypadku posiadania tej samej nazwy dla różnych atrybutów jest dodanie wbudowanych dostosowań jaxb do xsd:
+
. . wiążące deklaracje. .
lub dostosowania zewnętrzne ...
Więcej informacji można znaleźć pod adresem: http://jaxb.java.net/tutorial/section_5_3-Overriding-Names.html
źródło