Ondersteuning voor XML-bibliotheken in Java

1. Inleiding

In dit artikel zullen we Java XML-bibliotheken en API's vergelijken.

Dit is het tweede artikel uit de serie over Java-ondersteuning voor XML, als je dieper in wilt gaan op de XPath-ondersteuning in Java, bekijk dan het vorige artikel.

2. Overzicht

Nu gaan we dieper in op de XML-wereldondersteuning en daarvoor beginnen we met het zo eenvoudig mogelijk uitleggen van alle vakgerelateerde initialen.

In Java XML-ondersteuning kunnen we weinig API-definities vinden, elk heeft zijn voor- en nadelen.

SAX: Het is een op gebeurtenissen gebaseerde parsing-API, het biedt toegang op laag niveau, is geheugenefficiënt en sneller dan DOM omdat het niet de hele documentboom in het geheugen laadt, maar het biedt geen ondersteuning voor navigatie zoals die wordt geboden door XPath , hoewel het efficiënter is, is het ook moeilijker te gebruiken.

DOM: Het is een modelgebaseerde parser die een boomstructuurdocument in het geheugen laadt, dus we hebben de volgorde van de originele elementen, we kunnen in beide richtingen door ons document navigeren, het biedt een API voor lezen en schrijven, het biedt XML-manipulatie en het is heel gemakkelijk om gebruik hoewel de prijs een hoge druk op de geheugenbronnen is.

StAX: Het biedt het gemak van DOM en de efficiëntie van SAX, maar het mist enige functionaliteit die door DOM wordt geboden, zoals XML-manipulatie, en het stelt ons alleen in staat om door het document vooruit te navigeren.

JAXB: Het stelt ons in staat om in beide richtingen door het document te navigeren, het is efficiënter dan DOM, het maakt conversie van XML naar Java-typen mogelijk en het ondersteunt XML-manipulatie, maar het kan alleen een geldig XML-document parseren.

Je zou nog steeds enkele verwijzingen naar JAXP kunnen vinden, maar de laatste release van dit project is van maart 2013 en het is praktisch dood.

XML API-tabel

3. De XML

In dit gedeelte gaan we de meest populaire implementaties zien, zodat we echt werkende voorbeelden kunnen testen en de verschillen tussen de voorbeelden kunnen controleren.

In de volgende voorbeelden werken we met een eenvoudig XML-bestand met een structuur als deze:

  Guava Introductie tot Guava 04/04/2016 GuavaAuthor ... 

4. DOM4J

We gaan eerst kijken wat we ermee kunnen doen DOM4J en voor dit voorbeeld moeten we de laatste versie van deze afhankelijkheid toevoegen.

Dit is een van de meest populaire bibliotheken om mee te werken XML bestanden, omdat het ons in staat stelt om bidirectioneel te lezen, nieuwe documenten te maken en bestaande bij te werken.

DOM4J kan werken met DOM, SAX, XPath en XLST. SAX wordt ondersteund via JAXP.

Laten we hier bijvoorbeeld eens kijken, hoe we een element kunnen selecteren dat filtert op een gegeven id.

SAXReader-lezer = nieuwe SAXReader (); Document document = reader.read (bestand); Lijstelementen = document.selectNodes ("// * [@ tutId = '" + id + "']"); return elements.get (0);

De SAXReader class is verantwoordelijk voor het maken van een DOM4J boom uit SAX het ontleden van gebeurtenissen. Zodra we een org.dom4j.Document we hoeven alleen de benodigde methode aan te roepen en er de XPath uitdrukking als een Draad.

We kunnen een bestaand document laden, wijzigingen aanbrengen in de inhoud en vervolgens het originele bestand bijwerken.

voor (Node node: nodes) {Element element = (Element) node; Iterator iterator = element.elementIterator ("titel"); while (iterator.hasNext ()) {Elementtitel = (Element) iterator.next (); title.setText (title.getText () + "bijgewerkt"); }} XMLWriter-schrijver = nieuwe XMLWriter (nieuwe FileWriter (nieuw bestand ("src / test / resources / example_updated.xml"))); writer.write (document); schrijver.close ();

In het bovenstaande voorbeeld wijzigen we de inhoud van elke titel en maken we een nieuw bestand.

Merk hier op hoe eenvoudig het is om elke titel te krijgen knooppunt in een lijst door te bellen elementIterator en het doorgeven van de naam van de knooppunt.

Zodra we onze inhoud hebben gewijzigd, gebruiken we de XMLWriter dat duurt een DOM4J tree en formatteert het naar een stream als XML.

Het maken van een nieuw document vanaf het begin is net zo eenvoudig als we hieronder zien.

Document document = DocumentHelper.createDocument (); Element root = document.addElement ("XMLTutorials"); Element tutorialElement = root.addElement ("tutorial"). AddAttribute ("tutId", "01"); tutorialElement.addAttribute ("type", "xml"); tutorialElement.addElement ("title"). addText ("XML met Dom4J"); ... OutputFormat formaat = OutputFormat.createPrettyPrint (); XMLWriter-schrijver = nieuwe XMLWriter (nieuwe FileWriter (nieuw bestand ("src / test / resources / example_new.xml")), formaat); writer.write (document); schrijver.close (); 

DocumentHelper geeft ons een verzameling methoden om te gebruiken door DOM4J, zoals createDocument dat creëert een leeg document om ermee aan de slag te gaan.

We kunnen zoveel attributen of elementen maken als we nodig hebben met de methoden die worden geboden door DOM4J, en zodra we ons document hebben voltooid, schrijven we het gewoon naar een bestand zoals we eerder deden met de updatecase.

5. JDOM

Om mee te werken JDOM, we moeten deze afhankelijkheid toevoegen aan onze pom.

JDOM's werkstijl lijkt veel op DOM4J's, dus we gaan een paar voorbeelden bekijken:

SAXBuilder builder = nieuwe SAXBuilder (); Document doc = builder.build (this.getFile ()); Element tutorials = doc.getRootElement (); Lijsttitels = tutorials.getChildren ("tutorial"); 

In het bovenstaande voorbeeld halen we alle elementen uit het root-element op een heel eenvoudige manier zoals we kunnen doen DOM4J:

SAXBuilder builder = nieuwe SAXBuilder (); Document document = (Document) builder.build (bestand); String filter = "// * [@ tutId = '" + id + "']"; XPathFactory xFactory = XPathFactory.instance (); XPathExpression expr = xFactory.compile (filter, Filters.element ()); Lijstknooppunt = expr.evaluate (document);

Nogmaals, hier in de bovenstaande code hebben we een SAXBuilder het creëren van een Document instantie uit een bepaald bestand. We halen een element op door zijn tutId attribuut door een XPath uitdrukking aan de XPathFactory geleverd door JDOM2.

6. StAX

Nu gaan we kijken hoe we alle elementen uit ons root-element kunnen ophalen met behulp van de Stax API. Stax is opgenomen in de JDK sinds Java 6, dus u hoeft geen afhankelijkheden toe te voegen.

Ten eerste moeten we een Zelfstudie klasse:

openbare klas Tutorial {private String tutId; privé String-type; private String-titel; private String beschrijving; privé String-datum; private String-auteur; // standaard getters en setters}

en dan zijn we klaar om te volgen met:

Lijst met tutorials = nieuwe ArrayList (); XMLInputFactory factory = XMLInputFactory.newInstance (); XMLEventReader eventReader = factory.createXMLEventReader (nieuwe FileReader (this.getFile ())); Tutorial huidige; while (eventReader.hasNext ()) {XMLEvent event = eventReader.nextEvent (); schakelaar (event.getEventType ()) {case XMLStreamConstants.START_ELEMENT: StartElement startElement = event.asStartElement (); String qName = startElement.getName (). GetLocalPart (); ... pauze; case XMLStreamConstants.CHARACTERS: Characters characters = event.asCharacters (); ... pauze; case XMLStreamConstants.END_ELEMENT: EndElement endElement = event.asEndElement (); // controleer of we het afsluitende element hebben gevonden // sluit bronnen die expliciet gesloten moeten worden break; }}

In het bovenstaande voorbeeld moesten we, om ons te helpen bij het ophalen van de informatie, een klasse maken om de opgehaalde gegevens in op te slaan.

Om het document te lezen, hebben we zogenaamde event-handlers verklaard en we hebben ze gebruikt om door ons document te navigeren. Onthoud dat de SAX-implementaties geen bidirectionele navigatie bieden. Zoals u hier kunt zien, moet er veel werk worden verzet om een ​​eenvoudige lijst met elementen op te halen.

7. JAXB

JAXB is inbegrepen bij de JDK, evenals Xerces, hebben hier geen extra afhankelijkheid voor nodig.

Het is heel eenvoudig om informatie van een XML bestand met JAXB.

We hoeven alleen de juiste Java-entiteiten te maken om het XML en dat is het.

JAXBContext jaxbContext = JAXBContext.newInstance (Tutorials.class); Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller (); Tutorials tutorials = (Tutorials) jaxbUnmarshaller.unmarshal (this.getFile ());

In het bovenstaande voorbeeld laden we onze XML bestand in ons object en van daaruit kunnen we alles afhandelen als een normale Java-structuur;

Om een ​​nieuw document te maken, is het net zo eenvoudig als het lezen, maar doet u het omgekeerde, zoals in de onderstaande code.

Ten eerste gaan we onze Zelfstudie klasse toe te voegen JAXB annotaties aan getters en setters:

public class Tutorial {... public String getTutId () {return tutId; } @XmlAttribute public void setTutId (String tutId) {this.tutId = tutId; } ... @XmlElement public void setTitle (String-titel) {this.title = title; } ...} @XmlRootElement openbare klas Tutorials {privélijst tutorial; // standaard getters en setters met @XmlElement annotatie}

Met @XmlRootElement we definiëren welk object het hoofdknooppunt van ons document gaat vertegenwoordigen en gebruiken vervolgens @XmlAttribute of @XmlElement om te definiëren of dat attribuut een attribuut van een knooppunt of een element van het document vertegenwoordigt.

Dan kunnen we volgen met:

Tutorials tutorials = nieuwe Tutorials (); tutorials.setTutorial (nieuwe ArrayList ()); Tutorial tut = nieuwe Tutorial (); tut.setTutId ("01"); ... tutorials.getTutorial (). add (tut); JAXBContext jaxbContext = JAXBContext.newInstance (Tutorials.class); Marshaller jaxbMarshaller = jaxbContext.createMarshaller (); jaxbMarshaller.setProperty (Marshaller.JAXB_FORMATTED_OUTPUT, waar); jaxbMarshaller.marshal (tutorials, bestand);

Zoals u kunt zien, is het binden van een XML-bestand aan Java-objecten de gemakkelijkste manier om met dit soort bestanden te werken.

8. XPath Expression-ondersteuning

Om complexe XPath-expressies te maken, kunnen we Jaxen gebruiken. Dit is een open source XPath-bibliotheek die kan worden aangepast aan veel verschillende objectmodellen, waaronder DOM, XOM, DOM4J, en JDOM.

We kunnen XPath-expressies maken en deze compileren op basis van veel ondersteunde documenten.

String expression = "/ tutorials / tutorial"; XPath-pad = nieuwe DOMXPath (uitdrukking); Lijstresultaat = path.selectNodes (xmlDocument);

Om het te laten werken, moeten we deze afhankelijkheid aan ons project toevoegen.

9. Conclusie

Zoals u kunt zien, zijn er veel opties om mee te werken XML, afhankelijk van de vereisten van uw toepassing, kunt u met elk van hen werken of moet u misschien kiezen tussen efficiëntie en eenvoud.

Je kunt de volledig werkende voorbeelden voor dit artikel vinden in onze git-repository hier.