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:

  1. Behold den samme XML for alle prøvene våre
  2. Lag et syntaktisk og semantisk gyldig HTML5-dokument på slutten
  3. 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.


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