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:
- Ponechajte rovnaké XML pre všetky naše vzorky
- Na konci vytvorte syntakticky a sémanticky platný dokument HTML5
- 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.