המרת XML ל- HTML בג'אווה

1. הקדמה

במדריך זה נתאר כיצד להמיר XML ל- HTML באמצעות ספריות Java ומנועי תבניות נפוצים - JAXP, StAX, Freemarker ו- שפם.

2. XML ל- Unmarshal

נתחיל במסמך XML פשוט שנפרוס לייצוג ג'אווה מתאים לפני שנמיר אותו ל- HTML. נזכור כמה מטרות עיקריות:

  1. שמור את אותו XML עבור כל הדגימות שלנו
  2. צור מסמך HTML5 תקף מבחינה תחבירית וסמנטית בסוף
  3. המר את כל רכיבי ה- XML ​​לטקסט

בואו נשתמש בהודעת Jenkins פשוטה כ- XML ​​לדוגמא שלנו:

  [דוא"ל מוגן] בניית מס '7 עברה הצלחה: בניית ה- Jenkins CI עברה 

וזה די פשוט. הוא כולל אלמנט שורש וכמה אלמנטים מקוננים.

אנו שואפים להסיר את כל תגי ה- XML ​​הייחודיים ולהדפיס צמדי ערך מפתח בעת יצירת קובץ ה- HTML שלנו.

3. JAXP

Java Architecture for XML Processing (JAXP) היא ספריה שנועדה להרחיב את הפונקציונליות של מנתח SAX הפופולרי עם תמיכה נוספת ב- DOM. JAXP מספק את היכולת אובייקטים מוגדרים של XML למרשל ולא מרושל אל POJO וממנו באמצעות SAX Parser. נשתמש גם בעוזרי DOM המובנים.

בואו להוסיף את התלות של Maven עבור JAXP לפרויקט שלנו:

 javax.xml jaxp-api 1.4.2 

3.1. ביטול רישום באמצעות DOM Builder

בואו נתחיל בבקשה לבטל את האחסון של קובץ ה- XML ​​שלנו ב- Java אֵלֵמֶנט לְהִתְנַגֵד:

DocumentBuilderFactory מפעל = DocumentBuilderFactory.newInstance (); factory.setFeature (XMLConstants.FEATURE_SECURE_PROCESSING, נכון); factory.setFeature ("// apache.org/xml/features/disallow-doctype-decl", נכון); קלט מסמך = מפעל .newDocumentBuilder () .parse (resourcePath); אלמנט xml = input.getDocumentElement (); 

3.2. חילוץ תוכן קובץ ה- XML ​​במפה

עכשיו, בואו נבנה מַפָּה עם התוכן הרלוונטי בקובץ ה- XML ​​שלנו:

מפת מפה = HashMap חדש (); map.put ("כותרת", xml.getElementsByTagName ("כותרת"). פריט (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. Marshalling באמצעות DOM Builder

הפעלת ה- XML ​​שלנו לקובץ HTML מעורבת קצת יותר.

בואו נכין העברה מסמך שנשתמש בו כדי לכתוב את ה- HTML:

מסמך doc = מפעל .newDocumentBuilder () .newDocument (); 

לאחר מכן נמלא את מסמך עם ה אלמנטים בשלנו מַפָּה:

אלמנט html = doc.createElement ("html"); ראש אלמנט = doc.createElement ("ראש"); html.setAttribute ("lang", "en"); כותרת אלמנט = doc.createElement ("כותרת"); title.setTextContent (map.get ("כותרת")); head.appendChild (כותרת); html.appendChild (ראש); גוף היסוד = doc.createElement ("גוף"); אלמנט מ = doc.createElement ("p"); from.setTextContent (map.get ("from")); אלמנט הצלחה = doc.createElement ("p"); success.setTextContent (map.get ("תוכן")); body.appendChild (מ); body.appendChild (הצלחה); html.appendChild (גוף); doc.appendChild (html); 

לבסוף, בואו מרשל שלנו מסמך אובייקט באמצעות TransformerFactory:

TransformerFactory transformerFactory = TransformerFactory.newInstance (); transformerFactory.setFeature (XMLConstants.FEATURE_SECURE_PROCESSING, נכון); transformerFactory.setAttribute (XMLConstants.ACCESS_EXTERNAL_DTD, ""); transformerFactory.setAttribute (XMLConstants.ACCESS_EXTERNAL_STYLESHEET, ""); נסה (Writer output = new StringWriter ()) {Transformer transformer = transformerFactory.newTransformer (); transformer.transform (DOMSource חדש (doc), StreamResult חדש (פלט)); }

אם נתקשר output.toString (), נקבל את ייצוג ה- HTML.

שים לב שחלק מהתכונות הנוספות והתכונות שקבענו במפעל שלנו נלקחו מהמלצות פרויקט OWASP כדי למנוע הזרקת XXE.

4. StAX

ספרייה נוספת בה אנו יכולים להשתמש היא ה- Streaming API עבור XML (StAX). כמו JAXP, גם StAX קיים זמן רב - מאז 2004.

שתי הספריות האחרות מפשטות את ניתוח קבצי ה- XML. זה נהדר למשימות פשוטות או לפרויקטים, אך פחות מכך כשאנחנו צריכים לבצע איטרציה או להיות בעלי שליטה מפורשת ועדינה על אלמנט המנתח את עצמו. זה המקום בו StAX יועיל.

בואו להוסיף את התלות של Maven עבור ה- API של StAX לפרויקט שלנו:

 javax.xml.stream stax-api 1.0-2 

4.1. ביטול אחסון באמצעות StAX

נשתמש בזרימת בקרת איטרציה פשוטה ל- לאחסן ערכי XML ב מַפָּה:

XMLInputFactory מפעל = XMLInputFactory.newInstance (); factory.setProperty (XMLInputFactory.IS_SUPPORTING_EXTERNAL_ENTITIES, בוליאני.FALSE); factory.setProperty (XMLInputFactory.SUPPORT_DTD, בוליאני. FALSE); קלט XMLStreamReader = null; נסה (קובץ FileInputStream = FileInputStream חדש (resourcePath)) {input = factory.createXMLStreamReader (file); מפת מפה = HashMap חדש (); בעוד (input.hasNext ()) {input.next (); אם (input.isStartElement ()) {if (input.getLocalName (). שווה ("כותרת")) {map.put ("כותרת", input.getElementText ()); } אם (input.getLocalName (). שווה ("מ-")) {map.put ("מ-", String.format ("מ:% s", input.getElementText ())); } אם (input.getLocalName (). שווה ("תוכן")) {map.put ("תוכן", input.getElementText ()); }}}} סוף סוף {if (input! = null) {input.close (); }}

4.2. Marshalling באמצעות StAX

עכשיו, בואו נשתמש שלנו מַפָּה ו כתוב את ה- HTML:

נסה (Writer output = new StringWriter ()) {XMLStreamWriter writer = XMLOutputFactory .newInstance () .createXMLStreamWriter (פלט); writer.writeDTD (""); writer.writeStartElement ("html"); writer.writeAttribute ("lang", "en"); writer.writeStartElement ("ראש"); writer.writeDTD (""); writer.writeStartElement ("כותרת"); writer.writeCharacters (map.get ("כותרת")); writer.writeEndElement (); writer.writeEndElement (); writer.writeStartElement ("גוף"); writer.writeStartElement ("p"); writer.writeCharacters (map.get ("from")); writer.writeEndElement (); writer.writeStartElement ("p"); writer.writeCharacters (map.get ("תוכן")); writer.writeEndElement (); writer.writeEndElement (); writer.writeEndDocument (); writer.flush (); }

כמו בדוגמה של JAXP, אנחנו יכולים להתקשר output.toString () כדי לקבל את ייצוג ה- HTML.

5. שימוש במנועי תבנית

כחלופה לכתיבת ייצוג ה- HTML, אנו יכולים להשתמש במנועי תבנית. ישנן מספר אפשרויות במערכת האקולוגית של Java. בואו נחקור כמה מהן.

5.1. שימוש באפצ'י סמן חופשי

Apache FreeMarker הוא מנוע תבניות מבוסס Java לייצור פלט טקסט (דפי אינטרנט ב- HTML, דואר אלקטרוני, קבצי תצורה, קוד מקור וכו ') המבוסס על תבניות ושינוי נתונים.

על מנת להשתמש בו, נצטרך להוסיף את התלות בסמן החופשי לפרויקט Maven שלנו:

 org.freemarker freemarker 2.3.29 

ראשית, בואו ניצור תבנית באמצעות התחביר FreeMarker:

    $ {כותרת} 

$ {מאת}

$ {content}

עכשיו בואו נעשה שימוש חוזר ב מַפָּה ומלא את החסר בתבנית:

תצורה cfg = תצורה חדשה (Configuration.VERSION_2_3_29); cfg.setDirectoryForTemplateLoading (קובץ חדש (templateDirectory)); cfg.setDefaultEnoding (StandardCharsets.UTF_8.toString ()); cfg.setTemplateExceptionHandler (TemplateExceptionHandler.RETHROW_HANDLER); cfg.setLogTemplateExceptions (שקר); cfg.setWrapUncheckedExceptions (נכון); cfg.setFallbackOnNullLoopVariable (false); תבנית temp = cfg.getTemplate (templateFile); נסה (Writer output = new StringWriter ()) {temp.process (staxTransformer.getMap (), output); }

5.2. באמצעות שפם

שפם הוא מנוע תבניות ללא היגיון. ניתן להשתמש בשפם עבור HTML, קבצי תצורה, קוד מקור - כמעט כל דבר. זה עובד על ידי הרחבת תגים בתבנית באמצעות ערכים המסופקים ב- hash או באובייקט.

כדי להשתמש בו, נצטרך להוסיף את תלות השפם לפרויקט Maven שלנו:

 com.github.spullara.mustache.java מהדר 0.9.6 

נתחיל ביצירת תבנית באמצעות תחביר השפם:

    {{כּוֹתֶרֶת}} 

{{מ}}

{{תוֹכֶן}}

עכשיו, בואו נמלא את התבנית עם שלנו מַפָּה:

MustacheFactory mf = חדש DefaultMustacheFactory (); שפם שפם = mf.compile (templateFile); נסה (Writer output = new StringWriter ()) {mustache.execute (output, staxTransformer.getMap ()); output.flush (); }

6. ה- HTML שנוצר

בסופו של דבר, עם כל דוגמאות הקוד שלנו, נקבל את אותה פלט HTML:

    מבנה מס '7 עבר 

מאת: [מוגן בדוא"ל]

הצלחה: מבנה ה- Jenkins CI עבר

7. מסקנה

במדריך זה למדנו את יסודות השימוש ב- JAXP, StAX, Freemarker ו- Mustache כדי להמיר XML ל- HTML.

לקבלת מידע נוסף אודות XML ב- Java, עיין במשאבים הנהדרים האחרים כאן בבלדונג:

  • ערעור מחדש של XML לאובייקטים ב- XStream
  • סידור אובייקטים ל- XML ​​ב- XStream
  • ספריות Java XML

כמו תמיד, דוגמאות הקוד המלאות הנמצאות כאן זמינות באתר GitHub.


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