Pretvorite XML u HTML na Javi

1. Uvod

U ovom uputstvu opisat ćemo kako pretvoriti XML u HTML pomoću uobičajenih Java knjižnica i mehanizama predložaka - JAXP, StAX, Freemarker i Mustache.

2. XML za Unmaršala

Krenimo s jednostavnim XML dokumentom koji ćemo ukloniti u odgovarajući Java prikaz prije nego što ga pretvorimo u HTML. Imati ćemo na umu nekoliko ključnih ciljeva:

  1. Zadržite isti XML za sve naše uzorke
  2. Na kraju stvorite sintaktički i semantički valjani HTML5 dokument
  3. Pretvorite sve XML elemente u tekst

Koristimo jednostavnu Jenkinsovu obavijest kao naš uzorak XML-a:

  [zaštićena e-poštom] Izgradnja # 7 uspješna: uspjela je izrada Jenkins CI 

I to prilično jednostavno. Sadrži korijenski element i neke ugniježđene elemente.

Težit ćemo ukloniti sve jedinstvene XML oznake i ispisati parove ključ / vrijednost prilikom stvaranja naše HTML datoteke.

3. JAXP

Java Arhitektura za XML obradu (JAXP) je knjižnica koja je namijenjena proširenju funkcionalnosti popularnog SAX Parsera s dodatnom DOM podrškom. JAXP pruža mogućnost da maršal i nemaršal XML definirani objekti u i iz POJO-a koristeći SAX Parser. Također ćemo se koristiti ugrađenim DOM pomagačima.

Dodajmo Mavenovu ovisnost za JAXP našem projektu:

 javax.xml jaxp-api 1.4.2 

3.1. Demarširanje pomoću DOM Builder-a

Započnimo tako što ćemo prvo ukloniti oznaku naše XML datoteke u Javu Element objekt:

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance (); factory.setFeature (XMLConstants.FEATURE_SECURE_PROCESSING, istina); factory.setFeature ("// apache.org/xml/features/disallow-doctype-decl", istina); Ulaz u dokument = factory .newDocumentBuilder () .parse (resourcePath); Element xml = input.getDocumentElement (); 

3.2. Izdvajanje sadržaja XML datoteke na karti

Izgradimo sada Karta s relevantnim sadržajem naše XML datoteke:

Karta karte = novi HashMap (); map.put ("heading", xml.getElementsByTagName ("heading") .item (0) .getTextContent ()); map.put ("from", String.format ("from:% s", xml.getElementsByTagName ("from") .item (0) .getTextContent ())); map.put ("content", xml.getElementsByTagName ("content") .item (0) .getTextContent ());

3.3. Marširanje pomoću DOM Builder-a

Marširanje našeg XML-a u HTML datoteku malo je više uključeno.

Pripremimo transfer Dokument koje ćemo koristiti za ispisivanje HTML-a:

Dokument doc = tvornica .newDocumentBuilder () .newDocument (); 

Dalje ćemo ispuniti Dokument s Elementi u našem karta:

Element html = doc.createElement ("html"); Element head = doc.createElement ("glava"); html.setAttribute ("lang", "en"); Naslov elementa = doc.createElement ("naslov"); title.setTextContent (map.get ("heading")); head.appendChild (naslov); html.appendChild (glava); Tijelo elementa = doc.createElement ("tijelo"); Element iz = doc.createElement ("p"); from.setTextContent (map.get ("from")); Uspjeh elementa = doc.createElement ("p"); success.setTextContent (map.get ("content")); body.appendChild (od); body.appendChild (uspjeh); html.appendChild (tijelo); doc.appendChild (html); 

Napokon, krenimo maršal naš Dokument objekt pomoću a TransformerFactory:

TransformerFactory transformerFactory = TransformerFactory.newInstance (); transformerFactory.setFeature (XMLConstants.FEATURE_SECURE_PROCESSING, true); transformerFactory.setAttribute (XMLConstants.ACCESS_EXTERNAL_DTD, ""); transformerFactory.setAttribute (XMLConstants.ACCESS_EXTERNAL_STYLESHEET, ""); try (Writer output = new StringWriter ()) {Transformatorski transformator = transformerFactory.newTransformer (); transformer.transform (novi DOMSource (doc), novi StreamResult (izlaz)); }

Ako nazovemo output.toString (), dobit ćemo HTML prikaz.

Imajte na umu da su neke dodatne značajke i atributi koje smo postavili u našoj tvornici preuzete iz preporuka projekta OWASP kako bi se izbjeglo ubrizgavanje XXE.

4. STAX

Druga knjižnica koju možemo koristiti je Streaming API za XML (StAX). Kao i JAXP, i StAX postoji već dugo vremena - od 2004. godine.

Druge dvije knjižnice pojednostavnjuju raščlanjivanje XML datoteka. To je izvrsno za jednostavne zadatke ili projekte, ali manje kada trebamo ponoviti ili imati eksplicitnu i preciznu kontrolu nad samim raščlambom elementa. Tu StAX dobro dolazi.

Dodajmo Maven ovisnost za StAX API našem projektu:

 javax.xml.stream stax-api 1.0-2 

4.1. Demarširanje pomoću StAX-a

Upotrijebit ćemo jednostavan iteracijski kontrolni tok za pohraniti XML vrijednosti u naš Karta:

XMLInputFactory tvornica = XMLInputFactory.newInstance (); factory.setProperty (XMLInputFactory.IS_SUPPORTING_EXTERNAL_ENTITIES, Boolean.FALSE); factory.setProperty (XMLInputFactory.SUPPORT_DTD, Boolean.FALSE); XMLStreamReader input = null; probajte (FileInputStream file = new FileInputStream (resourcePath)) {input = factory.createXMLStreamReader (datoteka); Karta karte = novi HashMap (); while (input.hasNext ()) {input.next (); if (input.isStartElement ()) {if (input.getLocalName (). jednako ("heading")) {map.put ("heading", input.getElementText ()); } if (input.getLocalName (). jednako ("od")) {map.put ("od", String.format ("od:% s", input.getElementText ())); } if (input.getLocalName (). jednako ("sadržaj")) {map.put ("content", input.getElementText ()); }}}} napokon {if (input! = null) {input.close (); }}

4.2. Marširanje pomoću StAX-a

A sada, iskoristimo naš karta i ispišite HTML:

probajte (Writer output = novi StringWriter ()) {XMLStreamWriter Writer = XMLOutputFactory .newInstance () .createXMLStreamWriter (output); Writer.WriteDTD (""); writer.writeStartElement ("html"); writer.writeAttribute ("lang", "en"); writer.writeStartElement ("glava"); Writer.WriteDTD (""); writer.writeStartElement ("naslov"); writer.writeCharacters (map.get ("heading")); writer.writeEndElement (); writer.writeEndElement (); writer.writeStartElement ("tijelo"); writer.writeStartElement ("p"); writer.writeCharacters (map.get ("from")); writer.writeEndElement (); writer.writeStartElement ("p"); Writer.WriteCharacters (map.get ("sadržaj")); writer.writeEndElement (); writer.writeEndElement (); writer.writeEndDocument (); Writer.flush (); }

Kao u primjeru JAXP-a, možemo nazvati output.toString () da biste dobili HTML prikaz.

5. Korištenje predložaka motora

Kao alternativu pisanju HTML predstavljanja možemo koristiti mehanizme predložaka. U ekosustavu Java postoji više opcija. Istražimo neke od njih.

5.1. Korištenje Apache Freemarker

Apache FreeMarker je mehanizam predložaka zasnovan na Javi za generiranje izlaznog teksta (HTML web stranice, e-mailovi, konfiguracijske datoteke, izvorni kod itd.) Na temelju predložaka i promjena podataka.

Da bismo je mogli koristiti, morat ćemo dodati ovisnost slobodnog znaka u naš projekt Maven:

 org.freemarker freemarker 2.3.29 

Prvo stvorimo predložak koristeći sintaksu FreeMarker:

    $ {heading} 

$ {od}

$ {sadržaj}

Ajmo, ponovno upotrijebimo naše karta i popunite praznine u predlošku:

Konfiguracija cfg = nova konfiguracija (Configuration.VERSION_2_3_29); cfg.setDirectoryForTemplateLoading (nova datoteka (templateDirectory)); cfg.setDefaultEncoding (StandardCharsets.UTF_8.toString ()); cfg.setTemplateExceptionHandler (TemplateExceptionHandler.RETHROW_HANDLER); cfg.setLogTemplateExceptions (netačno); cfg.setWrapUn CheckExceptions (true); cfg.setFallbackOnNullLoopVariable (netačno); Temp temp = cfg.getTemplate (templateFile); try (Writer output = new StringWriter ()) {temp.process (staxTransformer.getMap (), output); }

5.2. Korištenje brkova

Brkovi su mehanizam predložaka bez logike. Brkovi se mogu koristiti za HTML, konfiguracijske datoteke, izvorni kod - gotovo sve. Djeluje tako da proširi oznake u predlošku pomoću vrijednosti danih u hashu ili objektu.

Da bismo ga koristili, morat ćemo dodati ovisnost o brkovima u naš projekt Maven:

 com.github.spullara.mustache.java kompajler 0.9.6 

Počnimo stvarati predložak koristeći sintaksu Mustache:

    {{naslov}} 

{{iz}}

{{sadržaj}}

Sad, ispunimo predložak s našim karta:

MustacheFactory mf = novi DefaultMustacheFactory (); Brkovi brkovi = mf.compile (templateFile); try (Writer output = new StringWriter ()) {mustache.execute (output, staxTransformer.getMap ()); output.flush (); }

6. Rezultirajući HTML

Na kraju, sa svim našim uzorcima koda, dobit ćemo isti HTML izlaz:

    Izrada # 7 je prošla 

od: [e-mail zaštićen]

Uspjeh: Izrada Jenkins CI je prošla

7. Zaključak

U ovom uputstvu naučili smo osnove korištenja JAXP, StAX, Freemarker i Mustache za pretvaranje XML-a u HTML.

Za više informacija o XML-u u Javi, pogledajte ove druge izvrsne resurse upravo ovdje na Baeldungu:

  • Deserijalizacija XML-a na objekte u XStreamu
  • Serijalizacija objekata u XML u XStreamu
  • Java XML knjižnice

Kao i uvijek, ovdje prikazani cjeloviti uzorci koda dostupni su na GitHubu.


$config[zx-auto] not found$config[zx-overlay] not found