XML konvertálása HTML-be Java-ban

1. Bemutatkozás

Ebben az oktatóanyagban leírjuk, hogyan kell konvertálja az XML-t HTML-be közös Java könyvtárak és sablonmotorok használatával - JAXP, StAX, Freemarker és Mustache.

2. XML Unmarshal-hoz

Kezdjük egy egyszerű XML dokumentummal, amelyet egy megfelelő Java reprezentációvá válunk, mielőtt HTML-vé konvertálnánk. Néhány fő célt szem előtt tartunk:

  1. Tartsa ugyanazt az XML-t minden mintánk esetében
  2. Hozzon létre egy szintaktikailag és szemantikailag érvényes HTML5 dokumentumot a végén
  3. Konvertálja az összes XML elemet szöveggé

Használjunk egyszerű Jenkins értesítést mint XML-t:

  [e-mail védett] A 7. számú build sikeres volt: A Jenkins CI build sikeres volt 

És ez elég egyértelmű. Tartalmaz egy gyökér elemet és néhány beágyazott elemet.

Célunk az lesz, hogy eltávolítsuk az összes egyedi XML-címkét, és kinyomtassuk a kulcs-érték párokat, amikor létrehozzuk a HTML-fájlunkat.

3. JAXP

A Java Architecture for XML Processing (JAXP) egy olyan könyvtár, amelynek célja a népszerű SAX-elemző funkcionalitásának kibővítése további DOM támogatással. A JAXP lehetőséget nyújt arra, hogy marsall és unmarshal XML által definiált objektumok a POJO-ba és onnan a SAX Parser segítségével. Ki fogjuk használni a beépített DOM segédprogramokat is.

Vegyük fel projektünkbe a JAXP Maven-függőségét:

 javax.xml jaxp-api 1.4.2 

3.1. Kibontás a DOM Builder használatával

Kezdjük azzal, hogy először feloldjuk az XML fájlunkat egy Java-ba Elem tárgy:

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance (); factory.setFeature (XMLConstants.FEATURE_SECURE_PROCESSING, true); factory.setFeature ("// apache.org/xml/features/disallow-doctype-decl", igaz); Dokumentumbevitel = gyári .newDocumentBuilder () .parse (resourcePath); Xml elem = input.getDocumentElement (); 

3.2. Az XML fájl tartalmának kibontása egy térképen

Most építsünk egy Térkép XML fájlunk megfelelő tartalmával:

Térképtérkép = új HashMap (); map.put ("heading", xml.getElementsByTagName ("title") .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. Bemutatkozás a DOM Builder használatával

Kicsit jobban érintett az XML-fájlunk HTML-fájlba rendezése.

Készítsünk elő egy transzfert Dokumentum amellyel kiírjuk a HTML-t:

Document doc = gyári .newDocumentBuilder () .newDocument (); 

Ezután kitöltjük a Dokumentum a ... val Elemek miénkben térkép:

Elem html = doc.createElement ("html"); Elem fej = doc.createElement ("fej"); html.setAttribute ("lang", "en"); Elem címe = doc.createElement ("cím"); title.setTextContent (map.get ("title")); head.appendChild (cím); html.appendChild (fej); Elem törzse = doc.createElement ("test"); Elem = doc.createElement ("p"); from.setTextContent (map.get ("from")); Az elem sikere = doc.createElement ("p"); siker.setTextContent (map.get ("tartalom")); body.appendChild (from); body.appendChild (siker); html.appendChild (test); doc.appendChild (html); 

Végül pedig marsall a mi Dokumentum objektum 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 (Író kimenete = új StringWriter ()) {Transzformátor transzformátor = transformerFactory.newTransformer (); transformer.transform (új DOMSource (doc), új StreamResult (output)); }

Ha hívunk output.toString (), megkapjuk a HTML reprezentációt.

Ne feledje, hogy a gyárunkban beállított néhány extra funkció és tulajdonság az OWASP projekt ajánlásaiból származik az XXE injekció elkerülése érdekében.

4. StAX

Egy másik könyvtár, amelyet használhatunk, a Streaming API for XML (StAX). A JAXP-hez hasonlóan a StAX is régóta létezik - 2004 óta.

A másik két könyvtár leegyszerűsíti az XML fájlok elemzését. Ez nagyszerű egyszerű feladatokhoz vagy projektekhez, de kevésbé amikor iterálnunk kell, vagy kifejezett és finom szemlélettel kell ellenőriznünk az elemzést, amely magát elemzi. Itt jön jól a StAX.

Vegyük hozzá a StAX API Maven-függőségét a projektünkhöz:

 javax.xml.stream stax-api 1.0-2 

4.1. Kibontás StAX használatával

Egyszerű iterációvezérlő folyamatot fogunk használni tárolja az XML értékeket a mi Térkép:

XMLInputFactory gyár = XMLInputFactory.newInstance (); factory.setProperty (XMLInputFactory.IS_SUPPORTING_EXTERNAL_ENTITIES, Boolean.FALSE); factory.setProperty (XMLInputFactory.SUPPORT_DTD, Boolean.FALSE); XMLStreamReader input = null; próbálkozzon (FileInputStream fájl = új FileInputStream (resourcePath)) {input = factory.createXMLStreamReader (fájl); Térképtérkép = új HashMap (); while (input.hasNext ()) {input.next (); if (input.isStartElement ()) {if (input.getLocalName (). egyenlő ("title")) {map.put ("title", input.getElementText ()); } if (input.getLocalName (). egyenlő ("from")) {map.put ("from", String.format ("from:% s", input.getElementText ())); } if (input.getLocalName (). egyenlő ("tartalom")) {map.put ("tartalom", input.getElementText ()); }}}} végül {if (input! = null) {input.close (); }}

4.2. Marshalling a StAX használatával

Most használjuk a mi térkép és írja ki a HTML-t:

try (Writer output = new StringWriter ()) {XMLStreamWriter író = XMLOutputFactory .newInstance () .createXMLStreamWriter (output); író.írjaDTD (""); író.writeStartElement ("html"); writer.writeAttribute ("lang", "en"); író.writeStartElement ("fej"); író.írjaDTD (""); író.writeStartElement ("cím"); író.írásiKarakterek (map.get ("címsor")); író.írjaEndElement (); író.írjaEndElement (); író.writeStartElement ("test"); writer.writeStartElement ("p"); író.írásiKarakterek (map.get ("from")); író.írjaEndElement (); writer.writeStartElement ("p"); író.írásiKarakterek (map.get ("tartalom")); író.írjaEndElement (); író.írjaEndElement (); író.writeEndDocument (); író.öblítés (); }

A JAXP példához hasonlóan hívhatunk output.toString () hogy megkapja a HTML reprezentációt.

5. Sablonmotorok használata

A HTML reprezentáció megírásának alternatívájaként használhatunk sablonmotorokat. Több opció van a Java ökoszisztémában. Fedezzük fel néhányukat.

5.1. Az Apache Freemarker használata

Az Apache FreeMarker egy Java-alapú sablonmotor, amely sablonok alapján szövegkimenetet (HTML weboldalakat, e-maileket, konfigurációs fájlokat, forráskódot stb.) Generál és adatokat változtat.

Használatához hozzá kell adnunk a freemarker függőséget a Maven projektünkhöz:

 org.freemarker freemarker 2.3.29 

Először hozzunk létre egy sablont a FreeMarker szintaxisa segítségével:

    $ {title} 

$ {from}

$ {content}

Most használjuk fel újra a sajátunkat térkép és töltse ki a sablon hiányosságait:

Configuration cfg = new Configuration (Configuration.VERSION_2_3_29); cfg.setDirectoryForTemplateLoading (új fájl (templateDirectory)); cfg.setDefaultEncoding (StandardCharsets.UTF_8.toString ()); cfg.setTemplateExceptionHandler (TemplateExceptionHandler.RETHROW_HANDLER); cfg.setLogTemplateExceptions (hamis); cfg.setWrapUncheckedExceptions (true); cfg.setFallbackOnNullLoopVariable (hamis); Template temp = cfg.getTemplate (templateFile); try (Writer output = new StringWriter ()) {temp.process (staxTransformer.getMap (), output); }

5.2. Bajusz használata

A bajusz logika nélküli sablonmotor. A bajusz használható HTML-hez, konfigurációs fájlokhoz, forráskódokhoz - nagyjából bármi. Úgy működik, hogy kibővíti a sablonban lévő címkéket egy kivonatban vagy objektumban megadott értékek felhasználásával.

Használatához hozzá kell adnunk a bajuszfüggőséget a Maven projektünkhöz:

 com.github.spullara.mustache.java fordító 0.9.6 

Kezdjük el létrehozni a sablont a Bajusz szintaxisa segítségével:

    {{cím}} 

{{tól től}}

{{tartalom}}

Most töltsük ki a sablont a mi térkép:

MustacheFactory mf = new DefaultMustacheFactory (); Bajusz bajusz = mf.compile (templateFile); try (Writer output = new StringWriter ()) {bajache.execute (output, staxTransformer.getMap ()); output.flush (); }

6. Az eredmény HTML

Végül az összes kódmintánkkal ugyanazt a HTML kimenetet kapjuk:

    A 7. számú építés sikeres volt 

innen: [e-mail védett]

Siker: A Jenkins CI build sikeres volt

7. Következtetés

Ebben az oktatóanyagban megtanultuk a JAXP, StAX, Freemarker és Mustache használatának alapjait az XML HTML formátumba konvertálásához.

Ha további információt szeretne megtudni a Java XML-jéről, nézze meg ezeket a további nagyszerű forrásokat itt: Baeldung:

  • Az XML deserializálása objektumokká az XStreamben
  • Objektumok sorosítása XML-be az XStreamben
  • Java XML könyvtárak

Mint mindig, az itt látható teljes kódminták elérhetők a GitHubon.