Konverter XML til HTML i Java
1. Introduksjon
I denne opplæringen vil vi beskrive hvordan du gjør det konvertere XML til HTML ved hjelp av vanlige Java-biblioteker og malmotorer - JAXP, StAX, Freemarker og Mustache.
2. En XML til Unmarshal
La oss starte med et enkelt XML-dokument som vi tar ut i en passende Java-representasjon før vi konverterer det til HTML. Vi vil huske på noen hovedmål:
- Behold den samme XML for alle prøvene våre
- Lag et syntaktisk og semantisk gyldig HTML5-dokument på slutten
- Konverter alle XML-elementer til tekst
La oss bruke et enkelt Jenkins-varsel som vårt eksempel på XML:
[email protected] Bygg nr. 7 bestått suksess: Jenkins CI-bygningen bestått
Og det er ganske greit. Den inkluderer et rotelement og noen nestede elementer.
Vi tar sikte på å fjerne alle de unike XML-kodene og skrive ut nøkkelverdipar når vi oppretter HTML-filen.
3. JAXP
Java Architecture for XML Processing (JAXP) er et bibliotek som var ment å utvide funksjonaliteten til den populære SAX Parser med ekstra DOM-støtte. JAXP gir muligheten til å marshal og unmarshal XML-definerte objekter til og fra POJOer ved hjelp av SAX Parser. Vi bruker også de innebygde DOM-hjelpere.
La oss legge til Maven-avhengigheten for JAXP i prosjektet vårt:
javax.xml jaxp-api 1.4.2
3.1. Unmarshalling ved hjelp av DOM Builder
La oss begynne med å først avmontere XML-filen vår i en Java Element gjenstand:
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance (); factory.setFeature (XMLConstants.FEATURE_SECURE_PROCESSING, true); factory.setFeature ("// apache.org/xml/features/disallow-doctype-decl", sant); Dokumentinngang = fabrikk .newDocumentBuilder () .parse (resourcePath); Element xml = input.getDocumentElement ();
3.2. Pakke ut XML-filinnholdet på et kart
La oss nå bygge en Kart med relevant innhold i XML-filen vår:
Kartkart = nytt HashMap (); map.put ("heading", xml.getElementsByTagName ("heading") .item (0) .getTextContent ()); map.put ("fra", String.format ("fra:% s", xml.getElementsByTagName ("fra"). element (0) .getTextContent ())); map.put ("content", xml.getElementsByTagName ("content") .item (0) .getTextContent ());
3.3. Marshalling ved hjelp av DOM Builder
Å samle XML-en vår i en HTML-fil er litt mer involvert.
La oss forberede en overføring Dokument som vi bruker til å skrive ut HTML:
Document doc = fabrikk .newDocumentBuilder () .newDocument ();
Deretter fyller vi Dokument med Elementer i vår kart:
Element html = doc.createElement ("html"); Elementhode = doc.createElement ("hode"); html.setAttribute ("lang", "en"); Elementtittel = doc.createElement ("tittel"); title.setTextContent (map.get ("heading")); head.appendChild (tittel); html.appendChild (hode); Element body = doc.createElement ("body"); Element fra = doc.createElement ("p"); from.setTextContent (map.get ("fra")); Element suksess = doc.createElement ("p"); success.setTextContent (map.get ("content")); body.appendChild (fra); body.appendChild (suksess); html.appendChild (kropp); doc.appendChild (html);
Til slutt, la oss marskalk vår Dokument objekt ved hjelp av en TransformerFactory:
TransformerFactory transformerFactory = TransformerFactory.newInstance (); transformerFactory.setFeature (XMLConstants.FEATURE_SECURE_PROCESSING, true); transformerFactory.setAttribute (XMLConstants.ACCESS_EXTERNAL_DTD, ""); transformerFactory.setAttribute (XMLConstants.ACCESS_EXTERNAL_STYLESHEET, ""); prøv (Writer output = new StringWriter ()) {Transformer transformer = transformerFactory.newTransformer (); transformer.transform (ny DOMSource (doc), ny StreamResult (output)); }
Hvis vi ringer output.toString (), får vi HTML-representasjonen.
Merk at noen av de ekstra funksjonene og attributtene vi setter på fabrikken vår, er hentet fra anbefalingene fra OWASP-prosjektet for å unngå XXE-injeksjon.
4. StAX
Et annet bibliotek vi kan bruke er Streaming API for XML (StAX). I likhet med JAXP har StAX eksistert lenge - siden 2004.
De to andre bibliotekene forenkler parsing av XML-filer. Det er flott for enkle oppgaver eller prosjekter, men i mindre grad når vi trenger å gjenta eller ha eksplisitt og finkornet kontroll over elementparsering. Det er der StAX kommer godt med.
La oss legge til Maven-avhengigheten for StAX API i prosjektet vårt:
javax.xml.stream stax-api 1.0-2
4.1. Unmarshalling ved hjelp av StAX
Vi bruker en enkel iterasjonskontrollflyt til lagre XML-verdier i våre Kart:
XMLInputFactory fabrikk = XMLInputFactory.newInstance (); factory.setProperty (XMLInputFactory.IS_SUPPORTING_EXTERNAL_ENTITIES, Boolean.FALSE); factory.setProperty (XMLInputFactory.SUPPORT_DTD, Boolean.FALSE); XMLStreamReader input = null; prøv (FileInputStream file = new FileInputStream (resourcePath)) {input = factory.createXMLStreamReader (file); Kartkart = nytt HashMap (); mens (input.hasNext ()) {input.next (); if (input.isStartElement ()) {if (input.getLocalName (). tilsvarer ("heading")) {map.put ("heading", input.getElementText ()); } hvis (input.getLocalName (). er lik ("fra")) {map.put ("fra", String.format ("fra:% s", input.getElementText ())); } hvis (input.getLocalName (). er lik ("innhold")) {map.put ("innhold", input.getElementText ()); }}}} til slutt {if (input! = null) {input.close (); }}
4.2. Marshalling ved hjelp av StAX
La oss nå bruke vår kart og skriv ut HTML:
prøv (Writer output = new StringWriter ()) {XMLStreamWriter writer = XMLOutputFactory .newInstance () .createXMLStreamWriter (output); writer.writeDTD (""); writer.writeStartElement ("html"); writer.writeAttribute ("lang", "en"); writer.writeStartElement ("hode"); writer.writeDTD (""); writer.writeStartElement ("tittel"); writer.writeCharacters (map.get ("heading")); writer.writeEndElement (); writer.writeEndElement (); writer.writeStartElement ("body"); writer.writeStartElement ("p"); writer.writeCharacters (map.get ("fra")); writer.writeEndElement (); writer.writeStartElement ("p"); writer.writeCharacters (map.get ("content")); writer.writeEndElement (); writer.writeEndElement (); writer.writeEndDocument (); writer.flush (); }
Som i JAXP-eksemplet kan vi ringe output.toString () for å få HTML-representasjonen.
5. Bruke malmotorer
Som et alternativ til å skrive HTML-representasjonen, kan vi bruke malmotorer. Det er flere alternativer i Java-økosystemet. La oss utforske noen av dem.
5.1. Bruker Apache Freemarker
Apache FreeMarker er en Java-basert malmotor for å generere tekstutdata (HTML-websider, e-post, konfigurasjonsfiler, kildekode, etc.) basert på maler og endring av data.
For å kunne bruke den, må vi legge til avhengigheten av frimerkere i vårt Maven-prosjekt:
org.freemarker freemarker 2.3.29
La oss først lage en mal ved hjelp av FreeMarker-syntaksen:
$ {heading} $ {fra}
$ {innhold}
La oss nå bruke vårt kart og fyll hullene i malen:
Configuration cfg = new Configuration (Configuration.VERSION_2_3_29); cfg.setDirectoryForTemplateLoading (ny fil (templateDirectory)); cfg.setDefaultEncoding (StandardCharsets.UTF_8.toString ()); cfg.setTemplateExceptionHandler (TemplateExceptionHandler.RETHROW_HANDLER); cfg.setLogTemplateExceptions (false); cfg.setWrapUncheckedExceptions (true); cfg.setFallbackOnNullLoopVariable (false); Mal temp = cfg.getTemplate (templateFile); prøv (Writer output = new StringWriter ()) {temp.process (staxTransformer.getMap (), output); }
5.2. Bruke bart
Bart er en logikkfri malmotor. Mustache kan brukes til HTML, konfigurasjonsfiler, kildekode - stort sett hva som helst. Det fungerer ved å utvide koder i en mal ved hjelp av verdier gitt i en hash eller et objekt.
For å bruke det, må vi legge til bartavhengigheten til Maven-prosjektet vårt:
com.github.spullara.mustache.java kompilator 0.9.6
La oss begynne å lage en mal ved bruk av Mustache-syntaksen:
{{overskrift}} {{fra}}
{{innhold}}
La oss nå fylle malen med vår kart:
MustacheFactory mf = ny DefaultMustacheFactory (); Bart bart = mf.compile (templateFile); prøv (Writer output = new StringWriter ()) {mustache.execute (output, staxTransformer.getMap ()); output.flush (); }
6. Den resulterende HTML-en
Til slutt, med alle våre kodeeksempler, får vi den samme HTML-utgangen:
Bygg nr. 7 bestått fra: [e-postbeskyttet]
Suksess: Jenkins CI-bygningen bestått
7. Konklusjon
I denne veiledningen har vi lært det grunnleggende om å bruke JAXP, StAX, Freemarker og Mustache til å konvertere XML til HTML.
For mer informasjon om XML i Java, sjekk ut disse andre gode ressursene her på Baeldung:
- Deserialisere XML til objekter i XStream
- Serialisere objekter til XML i XStream
- Java XML-biblioteker
Som alltid er de komplette kodeeksemplene som er sett her, tilgjengelige på GitHub.