Konverter XML til HTML i Java

1. Introduktion

I denne vejledning beskriver vi, hvordan du gør det konvertere XML til HTML ved hjælp af almindelige Java-biblioteker og skabelonmotorer - JAXP, StAX, Freemarker og Mustache.

2. En XML til Unmarshal

Lad os starte med et simpelt XML-dokument, som vi ophæver til en passende Java-repræsentation, før vi konverterer det til HTML. Vi husker et par nøglemål:

  1. Behold den samme XML for alle vores prøver
  2. Opret et syntaktisk og semantisk gyldigt HTML5-dokument i slutningen
  3. Konverter alle XML-elementer til tekst

Lad os bruge en simpel Jenkins-underretning som vores XML-eksempel:

  [email protected] Bygning nr. 7 bestået succes: Jenkins CI-bygningen bestået 

Og det er ret ligetil. Det inkluderer et rodelement og nogle indlejrede elementer.

Vi sigter mod at fjerne alle de unikke XML-tags og udskrive nøgleværdipar, når vi opretter vores HTML-fil.

3. JAXP

Java Architecture for XML Processing (JAXP) er et bibliotek, der var beregnet til at udvide funktionaliteten i den populære SAX Parser med yderligere DOM-understøttelse. JAXP giver mulighed for at marshal og unmarshal XML-definerede objekter til og fra POJO'er ved hjælp af SAX Parser. Vi bruger også de indbyggede DOM-hjælpere.

Lad os tilføje Maven-afhængighed for JAXP til vores projekt:

 javax.xml jaxp-api 1.4.2 

3.1. Afhentning af arkivering ved hjælp af DOM Builder

Lad os begynde med først at afmontere vores XML-fil i en Java Element objekt:

DocumentBuilderFactory fabrik = DocumentBuilderFactory.newInstance (); factory.setFeature (XMLConstants.FEATURE_SECURE_PROCESSING, sand); factory.setFeature ("// apache.org/xml/features/disallow-doctype-decl", sandt); Dokumentinput = fabrik .newDocumentBuilder () .parse (resourcePath); Element xml = input.getDocumentElement (); 

3.2. Udpakning af XML-filindholdet på et kort

Lad os nu bygge en Kort med det relevante indhold i vores XML-fil:

Kortkort = nyt HashMap (); map.put ("heading", xml.getElementsByTagName ("heading") .item (0) .getTextContent ()); map.put ("fra", String.format ("fra:% s", xml.getElementsByTagName ("fra"). item (0) .getTextContent ())); map.put ("content", xml.getElementsByTagName ("content") .item (0) .getTextContent ());

3.3. Marshalling ved hjælp af DOM Builder

At samle vores XML i en HTML-fil er lidt mere involveret.

Lad os forberede en overførsel Dokument som vi bruger til at udskrive HTML:

Dokument doc = fabrik .newDocumentBuilder () .newDocument (); 

Dernæst udfylder vi Dokument med Elementer i vores kort:

Element html = doc.createElement ("html"); Elementhoved = doc.createElement ("head"); html.setAttribute ("lang", "en"); Elementtitel = doc.createElement ("titel"); title.setTextContent (map.get ("heading")); head.appendChild (titel); html.appendChild (hoved); Element body = doc.createElement ("body"); Element fra = doc.createElement ("p"); from.setTextContent (map.get ("fra")); Element succes = doc.createElement ("p"); success.setTextContent (map.get ("indhold")); body.appendChild (fra); body.appendChild (succes); html.appendChild (body); doc.appendChild (html); 

Endelig, lad os marskal vores Dokument objekt ved hjælp af en TransformerFabrik:

TransformerFactory transformerFactory = TransformerFactory.newInstance (); transformerFactory.setFeature (XMLConstants.FEATURE_SECURE_PROCESSING, sand); 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-repræsentationen.

Bemærk, at nogle af de ekstra funktioner og attributter, vi indstiller på vores fabrik, er taget fra anbefalingerne fra OWASP-projektet for at undgå XXE-injektion.

4. StAX

Et andet bibliotek, vi kan bruge, er Streaming API til XML (StAX). Ligesom JAXP har StAX eksisteret i lang tid - siden 2004.

De to andre biblioteker forenkler parsing af XML-filer. Det er fantastisk til enkle opgaver eller projekter, men i mindre grad når vi har brug for at gentage eller have eksplicit og finkornet kontrol over elementets parsing. Det er her, StAX kommer til nytte.

Lad os føje Maven-afhængigheden af ​​StAX API til vores projekt:

 javax.xml.stream stax-api 1.0-2 

4.1. Afmontering ved hjælp af StAX

Vi bruger en simpel iterationskontrol til gemme XML-værdier i vores Kort:

XMLInputFactory fabrik = XMLInputFactory.newInstance (); factory.setProperty (XMLInputFactory.IS_SUPPORTING_EXTERNAL_ENTITIES, Boolean.FALSE); factory.setProperty (XMLInputFactory.SUPPORT_DTD, Boolean.FALSE); XMLStreamReader input = null; prøv (FileInputStream-fil = ny FileInputStream (resourcePath)) {input = factory.createXMLStreamReader (fil); Kortkort = nyt HashMap (); mens (input.hasNext ()) {input.next (); hvis (input.isStartElement ()) {hvis (input.getLocalName (). er lig med ("overskrift")) {map.put ("overskrift", input.getElementText ()); } hvis (input.getLocalName (). er lig med ("fra")) {map.put ("fra", String.format ("fra:% s", input.getElementText ())); } hvis (input.getLocalName (). er lig med ("indhold")) {map.put ("indhold", input.getElementText ()); }}}} endelig {if (input! = null) {input.close (); }}

4.2. Marshalling ved hjælp af StAX

Lad os nu bruge vores kort og skriv HTML'en ud:

prøv (Writer output = new StringWriter ()) {XMLStreamWriter writer = XMLOutputFactory .newInstance () .createXMLStreamWriter (output); writer.writeDTD (""); writer.writeStartElement ("html"); writer.writeAttribute ("lang", "en"); writer.writeStartElement ("hoved"); writer.writeDTD (""); writer.writeStartElement ("titel"); writer.writeCharacters (map.get ("overskrift")); writer.writeEndElement (); writer.writeEndElement (); writer.writeStartElement ("body"); writer.writeStartElement ("p"); writer.writeCharacters (map.get ("fra")); writer.writeEndElement (); writer.writeStartElement ("p"); writer.writeCharacters (map.get ("indhold")); writer.writeEndElement (); writer.writeEndElement (); writer.writeEndDocument (); writer.flush (); }

Som i JAXP-eksemplet kan vi ringe output.toString () for at få HTML-repræsentation.

5. Brug af skabelonmotorer

Som et alternativ til at skrive HTML-repræsentationen kan vi bruge skabelonmotorer. Der er flere muligheder i Java-økosystemet. Lad os udforske nogle af dem.

5.1. Brug af Apache Freemarker

Apache FreeMarker er en Java-baseret skabelonmotor til generering af tekstoutput (HTML-websider, e-mails, konfigurationsfiler, kildekode osv.) Baseret på skabeloner og ændring af data.

For at bruge det skal vi tilføje freemarker-afhængighed til vores Maven-projekt:

 org.freemarker freemarker 2.3.29 

Lad os først oprette en skabelon ved hjælp af FreeMarker-syntaksen:

    $ {overskrift} 

$ {fra}

$ {indhold}

Lad os nu genbruge vores kort og udfyld hullerne i skabelonen:

Konfiguration cfg = ny konfiguration (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); Skabelon temp = cfg.getTemplate (templateFile); prøv (Writer output = new StringWriter ()) {temp.process (staxTransformer.getMap (), output); }

5.2. Brug af overskæg

Overskæg er en logikfri skabelonmotor. Overskæg kan bruges til HTML, konfigurationsfiler, kildekode - stort set alt. Det fungerer ved at udvide tags i en skabelon ved hjælp af værdier, der er angivet i en hash eller et objekt.

For at bruge det skal vi tilføje overskægsafhængigheden til vores Maven-projekt:

 com.github.spullara.mustache.java compiler 0.9.6 

Lad os begynde at oprette en skabelon ved hjælp af Mustache-syntaksen:

    {{overskrift}} 

{{fra}}

{{indhold}}

Lad os nu udfylde skabelonen med vores kort:

MustacheFactory mf = ny DefaultMustacheFactory (); Overskægs overskæg = mf.compile (templateFile); prøv (Writer output = new StringWriter ()) {mustache.execute (output, staxTransformer.getMap ()); output.flush (); }

6. Den resulterende HTML

I sidste ende får vi med alle vores kodeeksempler den samme HTML-output:

    Bygge nr. 7 bestået 

fra: [email protected]

Succes: Jenkins CI-bygningen bestod

7. Konklusion

I denne vejledning har vi lært det grundlæggende i at bruge JAXP, StAX, Freemarker og Mustache til at konvertere XML til HTML.

For mere information om XML i Java, se disse andre gode ressourcer lige her på Baeldung:

  • Deserialisering af XML til objekter i XStream
  • Serialisering af objekter til XML i XStream
  • Java XML-biblioteker

Som altid er de komplette kodeeksempler, der ses her, tilgængelige på GitHub.


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