2010-01-11 9 views
5

Potrzebuję wygenerować wiele dokumentów XML z obiektów Java. Obiekty są głęboko odwzorowanymi obiektami ORM, a dokumenty XML są dla indeksu wyszukiwania (a la Lucene). Chcę móc utworzyć plik konfiguracyjny i przekazać go obiekt Java, który wypluje XML określony w konfiguracji. Najlepiej byłoby, gdyby konfiguracja składała się z odwzorowania (prawdopodobnie głębokich) właściwości po stronie Java do XPath lub czegoś podobnego po stronie XML.Co to jest dobra biblioteka do generowania dowolnego XML z Java?

JAXB jest nieodpowiedni, ponieważ chce utworzyć odwzorowanie jeden do jednego z danych obiektu na węzły XML. Spojrzałem na JIBX i XStream, ale żaden z nich nie był zaprojektowany, aby robić to, o czym mówię.

Zasadniczo chcę, aby Dozer, ale zaprojektowany, aby utworzyć dokument XML jako cel, a nie inny komponent Java. Z moich dotychczasowych badań wynika, że ​​sam będę musiał to napisać. Czy ktoś może zaoferować lepszą alternatywę?

EDYTOWANIE: Rozwiązanie nie może opierać się na możliwości modyfikowania źródłowych plików Java. Systemy oparte na adnotacjach są w tym przypadku bezużyteczne do moich celów. Powinno być możliwe zdefiniowanie "tłumaczy" dla poszczególnych odwzorowań, tak jak to jest w Dozer.

Należy zauważyć, że muszę być w stanie określić, że dane pole wejściowe w języku Java może być wyprowadzane w kilku różnych miejscach w wyjściu XML, w niektórych przypadkach może być transformowane, a nie w innych.

Rozważałem już wykonanie prostej translacji języka Java na format XML obiektów, a następnie wykonanie zadania przy użyciu XSLT, ale problem polega na tym, że są to obiekty głębokie z dwukierunkowymi połączeniami. Każde odwzorowanie obiektów na XML miałoby trudności z ustaleniem, jak głęboko w hierarchii obiektów ma się udać, nawet gdyby mogło śledzić, które obiekty powinny zostać zdyskredytowane, ponieważ już były widziane.

+0

JiBX powinien być dobry do tego, dlaczego nie podoba ci się? – skaffman

Odpowiedz

4

używam to: Simple

+0

Wygląda na to, że jest to całkowicie adnotacja. Chcę być w stanie osiągnąć mój cel wyłącznie poprzez plik konfiguracyjny i potencjalnie zestaw obiektów tłumaczących w celu prawidłowego sformatowania niektórych danych. Ponadto nie widzę żadnego sposobu na określenie jednej właściwości wejściowej dla wielu pól wyjściowych. – Jherico

+0

przegłosowano, ponieważ to było odpowiedź na oryginalne pytanie. –

+0

Nie za bardzo. Pomyślałem, że zrobiłem to dość oczywiste, że * chciałem * plik konfiguracyjny. – Jherico

1

Pan spojrzał na Castor?

W szczególności ten cytat z ich strony internetowej sprawia, że ​​myślę, że może robić to, co chcesz:

Choć możliwe jest, aby polegać na domyślnym zachowaniu rycynowego do organizowania i unmarshal Java obiektów do dokumentu XML , może być konieczna większa kontrola nad tym zachowaniem. Na przykład, jeśli model obiektów Java już istnieje, Castor XML Mapping może być używany jako pomost między dokumentem XML a tym modelem obiektów Java.

Kastor pozwala określić niektóre z jego działań związanych z rozkazywaniem i usuwaniem za pomocą pliku odwzorowania. Ten plik zawiera wyraźną informację dla Castora o tym, jak dany dokument XML i dany zestaw obiektów Java są ze sobą powiązane.

Inną możliwością może być JXM; ze strony internetowej:

Mapowanie Java XML (JXM) to narzędzie do pisania obiektów Java do XML i odczytywania ich z powrotem. JXM zapewnia domyślne mapowanie, dzięki czemu obiekty Java zgodne z konwencjami nazewnictwa Java Bean mogą być zapisywane w formacie XML przez wywołanie pojedynczej metody. Domyślne mapowanie można dostosować, tworząc i rejestrując klasy odwzorowań za pomocą środowiska JXM.

JXM różni się od innych narzędzi do wiązania XML, nie wymagając, aby obiekty zawierały lub dziedziczyły z kodu JXM. W obiektach nie ma generowanego kodu i nie trzeba implementować interfejsów JXM. Dostosowanie odbywa się poprzez pisanie kodu Java, a nie deskryptorów XML.

+0

Castor wydaje się być najbliższy temu, czego szukam. Jednak jego konfiguracja skoncentrowana na klasie sprawia, że ​​zastanawiam się, czy pozwala ona na wiele mapowań tego samego pola wejściowego na wiele wyjść. Nie widzę też przykładów mapowania głębokich pól. Zbadam jednak dalej. – Jherico

0

Spójrz na Xmappr.

Można go skonfigurować za pomocą zewnętrznego XML. Możesz mieć wiele mapowań, które dają różne wyniki z tego samego obiektu wejściowego.

Jesteśmy również gotowi pomóc - po prostu zapytaj na listę mailingową.

0

Użyliśmy Apache Velocity w przeszłości jako sposób na zachowanie prostoty.

Po prostu utwórz szablon dla XML, zapełnij strukturę danych i wstrzyknij strukturę danych na mapę. Pozwala na zmianę XML w czasie wykonywania, jeśli potrzebujesz (o ile twoja struktura danych zawiera wszystkie pola).

Jest to bardzo szybki i elastyczny sposób na wytworzenie dokumentu, nie tworzy on DOM, a więc jest dość oszczędny w użyciu pamięci.

+0

Wadą jest to, że jeśli zepsujesz szablony, możesz w pewnych okolicznościach wygenerować nieprawidłowy/niepoprawny kod XML. –

+0

Całkowicie się zgadzam. Nie jest to jednak trudne. Jeśli chcesz, możesz dodać oddzielną fazę sprawdzania poprawności. – Fortyrunner

0

Rozwiązanie chcesz to EclipseLink MOXy:

Moxy jest implementacją JAXB z rozszerzeniami

Moxy posiada zewnętrzny plik konfiguracyjny (na podstawie adnotacji JAXB z rozszerzeniami)

Has XPath oparciu mapping, do głębokiego mapowania:

zaprojektowany do obsługi ORM odwzorowane obiekty, w tym wsparcie dla relacji dwukierunkowych:

0

You dont określić ORM używasz, ale czy przypadkiem nie jest to hibernacji, można go użyć do zrobienia Java < -> odwzorowania XML, jak również. Dokumentacja nie jest tak dobra, jak w przypadku odwzorowań DB, ale nie jest trudna w użyciu. Duża zaleta: masz jedną mniejszą zależność, jedną mniej do nauki, a koncepcje, których nauczyłeś się na mapowanie bazy danych, mają zastosowanie głównie do mapowania XML.

patrz: http://docs.jboss.org/hibernate/core/3.3/reference/en/html/xml.html

Powiązane problemy