תמיכה בספריות XML בג'אווה

1. הקדמה

במאמר זה נשווה ספריות ו- API של Java XML.

זהו המאמר השני מהסדרה על תמיכה ב- Java ב- XML, אם ברצונך להעמיק בתמיכה ב- XPath בג'אווה עיין במאמר הקודם.

2. סקירה כללית

כעת אנו מתעמקים בתמיכה העולמית של XML ולשם כך נתחיל בהסבר כמה שיותר פשוט על כל ראשי התיבות הקשורים לנושא.

בתמיכה ב- Java XML אנו יכולים למצוא מעט הגדרות API, לכל אחת היתרונות והחסרונות שלה.

SAX: זהו ממשק API לניתוח מבוסס אירועים, הוא מספק גישה ברמה נמוכה, הוא יעיל בזיכרון ומהיר יותר מ- DOM מכיוון שהוא לא טוען את כל עץ המסמך בזיכרון אבל הוא לא מספק תמיכה לניווט כמו זה שמספק XPath. למרות שהוא יעיל יותר, קשה יותר להשתמש בו גם.

DOM: כמנתח מבוסס מודל הטוען מסמך של מבנה עץ בזיכרון, כך שיש לנו את סדר האלמנטים המקוריים, אנו יכולים לנווט את המסמך בשני הכיוונים, הוא מספק ממשק API לקריאה וכתיבה, הוא מציע מניפולציה של XML וזה קל מאוד להשתמש למרות שהמחיר הוא עומס גבוה על משאבי הזיכרון.

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

JAXB: זה מאפשר לנו לנווט במסמך בשני הכיוונים, הוא יעיל יותר מ- DOM, הוא מאפשר המרה מסוג XML לסוגי Java והוא תומך במניפולציה של XML אך הוא יכול לנתח רק מסמך XML תקף.

אתה עדיין יכול למצוא כמה הפניות ל- JAXP, אך המהדורה האחרונה של פרויקט זה היא ממרץ 2013 והיא כמעט מתה.

טבלת ממשקי API של XML

3. ה- XML

בחלק זה אנו הולכים לראות את היישומים הפופולריים ביותר, כדי שנוכל לבדוק דגימות עבודה אמיתיות ולבדוק את ההבדלים ביניהן.

בדוגמאות הבאות נעבוד עם קובץ XML פשוט עם מבנה כזה:

  מבוא לגויאבה 04/04/2016 גויאבה מחבר ... 

4. DOM4J

נתחיל במבט מה נוכל לעשות איתו DOM4J ולדוגמה זו עלינו להוסיף את הגרסה האחרונה של תלות זו.

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

DOM4J יכול לעבוד עם DOM, SAX, XPath ו XLST. SAX נתמך באמצעות JAXP.

בואו נסתכל כאן למשל, כיצד נוכל לבחור אלמנט מסנן לפי מזהה נתון.

SAXReader reader = SAXReader חדש (); מסמך מסמך = reader.read (קובץ); רכיבי רשימה = document.selectNodes ("// * [@ tutId = '" + id + "']"); return element.get (0);

ה SAXReader הכיתה אחראית ליצירת DOM4J עץ מ SAX ניתוח אירועים. ברגע שיש לנו org.dom4j.Document אנחנו רק צריכים לקרוא לשיטה הדרושה ולהעביר אליה את XPath ביטוי כ- חוּט.

אנו יכולים לטעון מסמך קיים, לבצע שינויים בתוכנו ואז לעדכן את הקובץ המקורי.

עבור (צומת צומת: צמתים) {אלמנט אלמנט = (אלמנט) צומת; איטרטור איטרטור = element.elementIterator ("כותרת"); ואילו (iterator.hasNext ()) {Element title = (Element) iterator.next (); title.setText (title.getText () + "מעודכן"); }} סופר XMLWriter = XMLWriter חדש (FileWriter חדש (קובץ חדש ("src / test / resources / example_updated.xml"))); author.write (מסמך); author.close ();

בדוגמה שלמעלה, אנו משנים את תוכן כל כותרת ויוצרים קובץ חדש.

שימו לב כאן כמה פשוט להשיג כל כותרת צוֹמֶת ברשימה על ידי התקשרות elementIterator ומעביר את שם ה צוֹמֶת.

לאחר ששינוי התוכן שלנו נשתמש ב- XMLWriter שלוקח a DOM4J עץ ומעצב אותו לזרם כ XML.

יצירת מסמך חדש מההתחלה היא פשוטה כפי שנראה בהמשך.

מסמך מסמך = DocumentHelper.createDocument (); אלמנט שורש = document.addElement ("XMLTutorials"); Element tutorialElement = root.addElement ("tutorial"). AddAttribute ("tutId", "01"); tutorialElement.addAttribute ("סוג", "xml"); tutorialElement.addElement ("כותרת"). addText ("XML עם Dom4J"); ... פורמט OutputFormat = OutputFormat.createPrettyPrint (); כותב XMLWriter = XMLWriter חדש (FileWriter חדש (קובץ חדש ("src / test / resources / example_new.xml")), פורמט); author.write (מסמך); author.close (); 

DocumentHelper נותן לנו אוסף של שיטות לשימוש DOM4J, כמו createDocument שיוצר מסמך ריק כדי להתחיל לעבוד איתו.

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

5. JDOM

על מנת לעבוד עם JDOM, עלינו להוסיף את התלות הזו לפום שלנו.

JDOM סגנון העבודה דומה למדי DOM4J, לכן אנו נסתכל על כמה דוגמאות:

בונה SAXBuilder = SAXBuilder חדש (); מסמך doc = builder.build (this.getFile ()); מדריכי אלמנטים = doc.getRootElement (); כותרות רשימה = tutorials.getChildren ("הדרכה"); 

בדוגמה שלעיל, אנו שולפים את כל האלמנטים מאלמנט השורש בצורה מאוד פשוטה כפי שאנחנו יכולים לעשות עם DOM4J:

בונה SAXBuilder = SAXBuilder חדש (); מסמך מסמך = (מסמך) builder.build (קובץ); מסנן מחרוזות = "// * [@ tutId = '" + id + "']"; XPathFactory xFactory = XPathFactory.instance (); XPathExpression expr = xFactory.compile (פילטר, Filters.element ()); צומת רשימה = expr.evaluate (מסמך);

שוב, כאן בקוד לעיל, יש לנו SAXBuilder ליצור מסמך מופע מקובץ נתון. אנו מאחזרים אלמנט לפי שלו tutId תכונה על ידי העברת XPath ביטוי ל XPathFactory המסופק על ידי JDOM2.

6. StAX

כעת נראה כיצד נוכל לאחזר את כל האלמנטים מאלמנט השורש שלנו באמצעות ה- ממשק API של Stax. סטקס כלול ב JDK מאז Java 6 אז אתה לא צריך להוסיף שום תלות.

ראשית, עלינו ליצור הדרכה מעמד:

הדרכה בכיתה ציבורית {פרוטוקול String tutId; סוג מחרוזת פרטי; כותרת מחרוזת פרטית; תיאור מחרוזת פרטי; תאריך מחרוזת פרטי; סופר מחרוזת פרטי; // סטרים וקובעים סטנדרטיים}

ואז אנו מוכנים לעקוב אחרי:

מדריכי רשימה = ArrayList חדש (); XMLInputFactory מפעל = XMLInputFactory.newInstance (); XMLEventReader eventReader = factory.createXMLEventReader (FileReader חדש (this.getFile ())); זרם ההדרכה; בעוד (eventReader.hasNext ()) {XMLEvent אירוע = eventReader.nextEvent (); switch (event.getEventType ()) {case XMLStreamConstants.START_ELEMENT: StartElement startElement = event.asStartElement (); מחרוזת qName = startElement.getName (). GetLocalPart (); ... לשבור; מקרה XMLStreamConstants.CHARACTERS: תווים תווים = event.asCharacters (); ... לשבור; מקרה XMLStreamConstants.END_ELEMENT: EndElement endElement = event.asEndElement (); // לבדוק אם מצאנו את אלמנט הסגירה // סגור משאבים שצריך לסגור במפורש break; }}

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

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

7. JAXB

JAXB כלול ב- JDK, כמו גם Xerces, אין צורך בתלות נוספת עבור זה.

זה פשוט מאוד לטעון, ליצור ולבצע מניפולציה של מידע מתוך XML קובץ באמצעות JAXB.

אנחנו רק צריכים ליצור את ישויות Java הנכונות כדי לאגד את ה- XML וזה הכל.

JAXBContext jaxbContext = JAXBContext.newInstance (Tutorials.class); Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller (); מדריכי הדרכה = (מדריכים) jaxbUnmarshaller.unmarshal (this.getFile ());

בדוגמה לעיל, אנו טוענים את שלנו XML קובץ לאובייקט שלנו ומשם אנו יכולים להתמודד עם הכל כמבנה Java רגיל;

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

ראשית, אנו הולכים לשנות את שלנו הדרכה כיתה להוסיף JAXB ביאורים ל גטרס ו קובעים:

הדרכה בכיתה ציבורית {... public String getTutId () {return tutId; } @XmlAttribute ציבורי ריק setTutId (מחרוזת tutId) {this.tutId = tutId; } ... @ XmlElement ריק ריק setTitle (כותרת מחרוזת) {this.title = title; } ...} @XmlRootElement הדרכות בכיתה ציבורית {הדרכה לרשימה פרטית; // סטרים וקובעים סטנדרטיים עם הערת @XmlElement}

עם @XmlRootElement אנו מגדירים איזה אובייקט עומד לייצג את צומת השורש של המסמך שלנו ואז אנו משתמשים @Xml תכונה אוֹ @XmlElement כדי להגדיר אם תכונה זו מייצגת תכונה של צומת או אלמנט של המסמך.

אז נוכל להמשיך עם:

הדרכות הדרכה = הדרכות חדשות (); tutorials.setTutorial (ArrayList חדש ()); Tut tut = הדרכה חדשה (); tut.setTutId ("01"); ... tutorials.getTutorial (). להוסיף (tut); JAXBContext jaxbContext = JAXBContext.newInstance (Tutorials.class); Marshaller jaxbMarshaller = jaxbContext.createMarshaller (); jaxbMarshaller.setProperty (Marshaller.JAXB_FORMATTED_OUTPUT, נכון); jaxbMarshaller.marshal (מדריכים, קובץ);

כפי שאתה יכול לראות, כריכת קובץ XML לאובייקטים של Java היא הדרך הקלה ביותר לעבוד בקבצים מסוג זה.

8. תמיכה בביטוי XPath

כדי ליצור ביטויים מורכבים של XPath, נוכל להשתמש ב- Jaxen. זוהי ספריית XPath בקוד פתוח המותאמת למודלים רבים של אובייקטים, כולל DOM, XOM, DOM4J, ו JDOM.

אנו יכולים ליצור ביטויים של XPath ולהרכיב אותם על פי מסמכים נתמכים רבים.

ביטוי מחרוזת = "/ הדרכות / הדרכה"; נתיב XPath = DOMXPath חדש (ביטוי); תוצאת רשימה = path.selectNodes (xmlDocument);

כדי שזה יעבוד נצטרך להוסיף תלות זו לפרויקט שלנו.

9. מסקנה

כפי שניתן לראות ישנן אפשרויות רבות לעבודה XML, בהתאם לדרישות היישום שלך, תוכל לעבוד עם כל אחת מהן, או שתצטרך לבחור בין יעילות לפשטות.

תוכל למצוא את דגימות העבודה המלאות עבור מאמר זה במאגר git שלנו כאן.


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