Prevod XML na HTML v Jave

1. Úvod

V tomto výučbe si popíšeme, ako na to prevádzať XML na HTML pomocou bežných knižníc Java a šablónových nástrojov - JAXP, StAX, Freemarker a Mustache.

2. XML pre Unmarshal

Začnime jednoduchým dokumentom XML, ktorý predtým, ako ho prevedieme do formátu HTML, rozdelíme do vhodnej reprezentácie Java. Budeme mať na pamäti niekoľko kľúčových cieľov:

  1. Ponechajte rovnaké XML pre všetky naše vzorky
  2. Na konci vytvorte syntakticky a sémanticky platný dokument HTML5
  3. Preveďte všetky prvky XML na text

Ako vzorový súbor XML použijeme jednoduché Jenkinsovo oznámenie:

  [chránené e-mailom] Zostava č. 7 prešla Úspech: Zostava Jenkins CI prešla 

A je to dosť priame. Zahŕňa koreňový prvok a niektoré vnorené prvky.

Pri vytváraní nášho súboru HTML sa pokúsime odstrániť všetky jedinečné značky XML a vytlačiť páry kľúč - hodnota.

3. JAXP

Java Architecture for XML Processing (JAXP) je knižnica, ktorá mala rozšíriť funkčnosť populárneho analyzátora SAX Parser o ďalšiu podporu DOM. JAXP poskytuje schopnosť zaraďovať a zaraďovať objekty definované v XML do az POJO pomocou SAX Parser. Využijeme tiež vstavaných pomocníkov DOM.

Pridajme do nášho projektu závislosť Maven pre JAXP:

 javax.xml jaxp-api 1.4.2 

3.1. Zrušenie zdieľania pomocou nástroja DOM Builder

Začnime tým, že najskôr rozdelíme náš súbor XML do jazyka Java Element objekt:

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance (); factory.setFeature (XMLConstants.FEATURE_SECURE_PROCESSING, true); factory.setFeature ("// apache.org/xml/features/disallow-doctype-decl", pravda); Vstup dokumentu = továreň .newDocumentBuilder () .parse (resourcePath); Element xml = input.getDocumentElement (); 

3.2. Extrahovanie obsahu súboru XML na mape

Teraz poďme postaviť Mapa s príslušným obsahom nášho súboru XML:

Mapová mapa = nová HashMap (); map.put ("nadpis", xml.getElementsByTagName ("nadpis") .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. Zaradenie pomocou nástroja DOM Builder

Zaradenie nášho XML do súboru HTML je o niečo viac zapojené.

Pripravíme si prevod Dokument ktoré použijeme na napísanie kódu HTML:

Dokument doc = továreň .newDocumentBuilder () .newDocument (); 

Ďalej vyplníme Dokument s Prvky v našom mapa:

Element html = doc.createElement ("html"); Element head = doc.createElement ("head"); html.setAttribute ("lang", "en"); Názov prvku = doc.createElement ("názov"); title.setTextContent (map.get ("nadpis")); head.appendChild (titul); html.appendChild (hlava); Prvok body = doc.createElement ("telo"); Prvok z = doc.createElement ("p"); from.setTextContent (map.get ("from")); Úspešnosť prvku = doc.createElement ("p"); success.setTextContent (map.get ("obsah")); body.appendChild (z); body.appendChild (úspech); html.appendChild (telo); doc.appendChild (html); 

Nakoniec poďme maršal náš Dokument objekt pomocou 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 ()) {Transformer transformer = transformerFactory.newTransformer (); transformer.transform (nový DOMSource (doc), nový StreamResult (výstup)); }

Ak zavoláme output.toString (), dostaneme HTML reprezentáciu.

Upozorňujeme, že niektoré ďalšie funkcie a atribúty, ktoré sme nastavili v našej továrni, boli prevzaté z odporúčaní projektu OWASP, aby sa zabránilo injektovaniu XXE..

4. STAX

Ďalšou knižnicou, ktorú môžeme použiť, je Streaming API pre XML (StAX). Rovnako ako JAXP, aj StAX existuje už dlho - od roku 2004.

Ďalšie dve knižnice zjednodušujú analýzu súborov XML. To je skvelé pre jednoduché úlohy alebo projekty, ale menej keď potrebujeme iterovať alebo mať explicitnú a podrobnú kontrolu nad analýzou prvku. To je miesto, kde sa StAX hodí.

Pridajme do nášho projektu závislosť Maven pre StAX API:

 javax.xml.stream stax-api 1.0-2 

4.1. Zrušenie zdieľania pomocou služby StAX

Použijeme jednoduchý tok riadenia iterácie do ukladať hodnoty XML do nášho Mapa:

XMLInputFactory factory = XMLInputFactory.newInstance (); factory.setProperty (XMLInputFactory.IS_SUPPORTING_EXTERNAL_ENTITIES, Boolean.FALSE); factory.setProperty (XMLInputFactory.SUPPORT_DTD, Boolean.FALSE); Vstup XMLStreamReader = null; try (FileInputStream file = new FileInputStream (resourcePath)) {input = factory.createXMLStreamReader (file); Mapová mapa = nová HashMap (); while (input.hasNext ()) {input.next (); if (input.isStartElement ()) {if (input.getLocalName (). equals ("hlavička")) {map.put ("hlavička", input.getElementText ()); } if (input.getLocalName (). equals ("from")) {map.put ("from", String.format ("from:% s", input.getElementText ())); } if (input.getLocalName (). equals ("content")) {map.put ("content", input.getElementText ()); }}}} nakoniec {if (input! = null) {input.close (); }}

4.2. Zaradenie pomocou StAX

Teraz použijeme našu mapa a vypísať HTML:

try (Writer output = new StringWriter ()) {XMLStreamWriter writer = XMLOutputFactory .newInstance () .createXMLStreamWriter (výstup); writer.writeDTD (""); writer.writeStartElement ("html"); writer.writeAttribute ("lang", "en"); writer.writeStartElement ("hlava"); writer.writeDTD (""); writer.writeStartElement ("názov"); writer.writeCharacters (map.get ("hlavička")); writer.writeEndElement (); writer.writeEndElement (); writer.writeStartElement ("telo"); writer.writeStartElement ("p"); writer.writeCharacters (map.get ("od")); writer.writeEndElement (); writer.writeStartElement ("p"); writer.writeCharacters (map.get ("content")); writer.writeEndElement (); writer.writeEndElement (); writer.writeEndDocument (); writer.flush (); }

Rovnako ako v príklade JAXP môžeme volať output.toString () získať reprezentáciu HTML.

5. Používanie šablónových motorov

Ako alternatívu k písaniu HTML reprezentácie môžeme použiť šablónové stroje. V ekosystéme Java existuje niekoľko možností. Poďme preskúmať niektoré z nich.

5.1. Používanie značky Apache Freemarker

Apache FreeMarker je šablónový engine založený na prostredí Java na generovanie textového výstupu (webové stránky HTML, e-maily, konfiguračné súbory, zdrojový kód atď.) Na základe šablón a zmeny údajov.

Aby sme to mohli použiť, budeme musieť do nášho projektu Maven pridať závislosť značky voľných značiek:

 org.freemarker freemarker 2.3.29 

Najskôr vytvorme šablónu pomocou syntaxe FreeMarker:

    $ {okruhu} 

$ {od}

$ {content}

Teraz znova použijeme našu mapa a vyplňte medzery v šablóne:

Konfigurácia cfg = nová konfigurácia (Configuration.VERSION_2_3_29); cfg.setDirectoryForTemplateLoading (nový súbor (templateDirectory)); cfg.setDefaultEncoding (StandardCharsets.UTF_8.toString ()); cfg.setTemplateExceptionHandler (TemplateExceptionHandler.RETHROW_HANDLER); cfg.setLogTemplateExceptions (false); cfg.setWrapUncheckedExceptions (true); cfg.setFallbackOnNullLoopVariable (false); Temp šablóny = cfg.getTemplate (templateFile); try (Writer output = new StringWriter ()) {temp.process (staxTransformer.getMap (), output); }

5.2. Pomocou fúzy

Moustache je šablónový stroj bez logiky. Fúzy je možné použiť na HTML, konfiguračné súbory, zdrojový kód - skoro všetko. Funguje to tak, že značky sa rozšíria v šablóne pomocou hodnôt poskytnutých v hashe alebo objekte.

Aby sme to mohli použiť, budeme musieť do nášho projektu Maven pridať závislosť na fúzoch:

 com.github.spullara.mustache.java kompilátor 0.9.6 

Začnime vytvárať šablónu pomocou syntaxe Mustache:

    {{titulok}} 

{{od}}

{{content}}

Teraz vyplňme šablónu našou mapa:

MustacheFactory mf = new DefaultMustacheFactory (); Fúzy fúzy = mf.compile (templateFile); try (Writer output = new StringWriter ()) {mustache.execute (output, staxTransformer.getMap ()); output.flush (); }

6. Výsledný HTML

Nakoniec dostaneme so všetkými našimi ukážkami kódu rovnaký výstup HTML:

    Stavba č. 7 prešla 

z: [chránené e-mailom]

Úspech: Zostava Jenkins CI prešla

7. Záver

V tomto tutoriáli sme sa naučili základy používania JAXP, StAX, Freemarker a Mustache na prevod XML do HTML.

Ak sa chcete dozvedieť viac informácií o XML v jazyku Java, pozrite si tieto ďalšie skvelé zdroje tu na Baeldungu:

  • Deserializácia XML na objekty v XStreame
  • Serializácia objektov na XML v XStreame
  • Knižnice XML XML

Kompletné ukážky kódu, ktoré sú tu zobrazené, sú ako vždy k dispozícii na GitHub.


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