2012-01-28 21 views
6

Jaki jest najszybszy i najbardziej efektywny sposób tworzenia dokumentów XML w Javie? Istnieje mnóstwo bibliotek (woodstox, xom, xstream ...), zastanawiając się, czy ktoś ma jakieś dane. Czy powinienem używać podejścia do generowania kodu (skoro schemat xml jest dobrze znany)? Lub podejście refleksyjne w czasie wykonywania?Najszybszy i najbardziej efektywny sposób tworzenia XML

edytować przy użyciu dodatkowych informacji:

  1. Dobrze zdefiniowane XML Schema jest dostępna i rzadko zmienia
  2. warunek jest przekształcenie obiektu Javy do XML, a nie odwrotnie
  3. Tysiące obiektów java do XML na sekundę
  4. Generowanie kodu, złożoność kodu, konfiguracja, konserwacja itp. jest drugim względem wyższej wydajności.
+1

Jak zdefiniować wydajny? Najmniej zużycie pamięci? Najmniej linii kodu do użycia? Najszybciej robisz co? Marshaling? Unmarshaling dużych dokumentów? Ładne drukowanie? Co robisz, wymaga "najszybszej" biblioteki? Pamiętaj, aby wybrać bibliotekę na podstawie tego, co naprawdę ważne, a nie kryteriów, które nie mają znaczenia. Może się okazać, że lepiej wybrać bibliotekę, która jest "wystarczająco szybka", ponieważ jest ona łatwiejsza w użyciu niż biblioteka, która jest "najszybsza", ale jest kompletnym bólem głowy do użycia i utrzymywania. – Paul

+0

"Najbardziej efektywne" wyrażenie nie jest jasne. Najbardziej wydajne dla pamięci lub procesora pomoc w wyjaśnieniu. –

+1

możliwy duplikat [Która biblioteka serializacji xml jest zorientowana na wydajność?] (Http://stackoverflow.com/questions/5918665/which-xml-serialization-library-is-performance-oriented) – skaffman

Odpowiedz

11

Gdybym miał stworzyć bardzo prosty zawartość XML, chciałbym trzymać się tylko api JDK, wprowadzając żadnych zależności od stron trzecich.

Więc dla prostego XML i gdybym był mapować plik XML do klas Java (lub odwrotnie), chciałbym przejść do JAXB. See this tutorial, aby zobaczyć, jakie to proste.

Teraz.

Gdybym miał stworzyć jakieś bardziej zaawansowane wyjście XML ze stałym schematem, mógłbym użyć silnika szablonowego, Freemarker. Thymeleaf również wygląda ładnie.

I na koniec.

Gdybym miał bardzo skutecznie tworzyć ogromne pliki XML, chciałbym użyć SAX parser.

Mam nadzieję, że teraz rozumiesz, że masz dużo możliwości - wybierz najlepsze dopasowanie do swoich potrzeb :)

i baw się dobrze!

+6

Nie uważam "StringBuilder" za prosty sposób tworzenia poprawnego xml. Myślę, że to najbardziej skomplikowany sposób, ponieważ musisz zrobić wszystko samemu. Zobacz, jak łatwo jest utworzyć xml z obiektów za pomocą EclipseLink MOXy, na przykład: [MOXy: Getting Started] (http://wiki.eclipse.org/EclipseLink/Examples/MOXy/GettingStarted/TheBasics) To jest łatwiejsze niż użycie ' StringBuilder'. – Paul

+0

@Paul, dobry punkt. Mówiąc najprościej miałem na myśli - nie wprowadzając żadnych zależności od stron trzecich i unikając SAX. Będę edytować odpowiedź. –

+1

Dzięki Lukas, jak wspomniano wcześniej, chcę uzyskać szybsze wykonanie. XML nie jest ogromny. Nie potrzebuję mapowania plików XML na obiekty Java. Pomaga to zawęzić to. Podoba mi się idea silników szablonowych, które obejrzę. Opublikuję tutaj moje doświadczenie. – arrehman

2

Po pierwsze ważne jest, aby serializacja była prawidłowa. Ręcznie pisane serializery zwykle nie są. Na przykład mają tendencję do zapominania, że ​​ciąg "]]>" nie może pojawić się w węźle tekstowym.

To nie jest trudne napisanie własnego serializatora, który jest poprawny i szybki, jeśli jesteś zdolnym programistą Java, ale ponieważ niektórzy bardzo zdolni programiści Java byli tutaj, zanim myślę, że jesteś mało prawdopodobny, by pokonać ich przez wystarczający margines, aby opłacić wysiłek napisania własnego kodu.

Z wyjątkiem być może, że większość bibliotek ogólnego przeznaczenia może zostać nieco spowolniona, oferując opcje serializacji - takie jak wcięcia, kodowanie lub jak wybranie zakończenia linii. Możesz po prostu wycisnąć dodatkową uncję wydajności, unikając niepożądanych funkcji.

Ponadto, niektóre biblioteki ogólnego przeznaczenia mogą sprawdzać poprawność formułowania tego, co na nich rzucasz, na przykład sprawdzanie, czy prefiksy przestrzeni nazw są zadeklarowane (lub deklarowanie, jeśli nie). Możesz zrobić to szybciej, jeśli nie sprawdzisz. Z drugiej strony możesz stworzyć bibliotekę szybką, ale świnię do pracy. Osiąganie wyników ponad wszystkie inne cele jest prawie zawsze błędem.

Jeśli chodzi o wydajność dostępnych bibliotek, zmierz je i powiedz nam, czego się dowiesz.

+0

Wspomniałeś o kilku ważnych aspektach dotyczących wydajności. Dzięki. – arrehman

4

Spróbuj Xembly, mała biblioteka open source, która sprawia, że ​​ten proces tworzenia XML bardzo łatwy i intuicyjny:

String xml = new Xembler(
    new Directives() 
    .add("root") 
    .add("order") 
    .attr("id", "553") 
    .set("$140.00") 
).xml(); 

Xembly jest owinięcie wokół rodzimej Java DOM, i jest bardzo lekka biblioteka (jestem deweloper).

+1

Ten post był dla mnie również pomocny: http://www.yegor256.com/2014/04/09/xembly-intro.html –

+0

Twoja biblioteka wygląda na użyteczną, ale czy jest wydajna? Dobrze jest pozbyć się gadatliwości, gdy jest to właściwe, ale pytanie dotyczy najszybszego i najskuteczniejszego sposobu pisania kodu XML. Patrząc na powyższy przykład powiedziałbym, że nie jest to dobre rozwiązanie do wydajnego pisania dużych plików XML.Mimo że lubię twoją bibliotekę do innych przypadków użycia, mam ochotę to zasugerować, ponieważ on jest najszybszy i najbardziej skuteczny, nie jest dokładny i promujesz swój produkt zamiast udzielać najlepszej odpowiedzi. Ale popraw mnie, jeśli się mylę. –

1

Najmilszym sposobem, jaki znam jest użycie silnika XPath, który jest w stanie tworzyć węzły. XMLBeam jest w stanie to zrobić (w teście JUnit tutaj):

public interface Projection { 

    @XBWrite("/create/some/xml/structure[@even='with Predicates']") 
    void demo(String value); 
} 

@Test 
public void demo() { 
    Projection projection = new XBProjector(Flags.TO_STRING_RENDERS_XML).projectEmptyDocument(Projection.class); 
    projection.demo("Some value"); 
    System.out.println(projection); 
} 

Ten program drukuje:

<create> 
    <some> 
     <xml> 
     <structure even="with Predicates">Some value</structure> 
     </xml> 
    </some> 
</create> 
Powiązane problemy