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:
- Behold den samme XML for alle vores prøver
- Opret et syntaktisk og semantisk gyldigt HTML5-dokument i slutningen
- 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.