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:
- Zadržite isti XML za sve naše uzorke
- Na kraju stvorite sintaktički i semantički valjani HTML5 dokument
- 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.