Reklame

Kunne du tænke dig at lære at læse og skrive en XML-fil fra java?

XML-filer Hvad er en XML-fil, og hvordan kan du åbne og bruge den?Du har måske set udtrykket "XML." Du kan endda have åbnet en XML-fil ved et uheld. Hvad er XML, og hvordan bruger du det? Læs mere bruges til en række forskellige formål, herunder opbevaring af data. Før JSON blev populær, var XML det foretrukne format til at repræsentere, gemme og transportere strukturerede data. Selvom populariteten af ​​XML er aftaget i de senere år, kan du støde på det af og til, så det er vigtigt at lære at arbejde med det fra kode.

Java Standard Edition (SE) 10 kerne Java-koncepter, du bør lære, når du kommer i gangUanset om du skriver en GUI, udvikler software på serversiden eller en mobilapplikation, der bruger Android, vil det at lære Java tjene dig godt. Her er nogle grundlæggende Java-koncepter, der hjælper dig med at komme i gang. Læs mere omfatter Java API til XML-behandling (JAXP), som er en paraplybetegnelse, der dækker de fleste aspekter af XML-behandling. Disse omfatter:

instagram viewer
  • DOM: Document Object Model inkluderer klasser til at arbejde med XML-artefakter såsom element, node, attributter osv. DOM API'et indlæser hele XML-dokumentet i hukommelsen til behandling, så det er ikke særlig velegnet til at arbejde med store XML-filer.
  • SAX: Simple API for XML er en hændelsesdrevet algoritme til at læse XML. Her behandles XML ved at udløse hændelser fundet ved læsning af XML. Hukommelseskravene for at bruge denne metode er lave, men at arbejde med API'en er mere komplekst end at arbejde med DOM'en.
  • STAX: Streaming API til XML er en nylig tilføjelse til XML API'erne og giver højtydende strømfiltrering, behandling og ændring af XML. Selvom det undgår at indlæse hele XML-dokumentet i hukommelsen, giver det snarere en pull-type arkitektur end en begivenhedsdrevet arkitektur, så applikationen er lettere at kode og forstå end at bruge SAX API.

I denne artikel bruger vi DOM API at demonstrere, hvordan man læser og skriver XML-filer fra java. Vi vil dække de to andre API'er i fremtidige artikler.

Et eksempel på en XML-fil

Til formålet med denne artikel demonstrerer vi begreberne ved hjælp af følgende eksempel-XML, som kan findes her:

 1.0?>Gambardella, MatthewXML-udviklervejledning
Computer44.952000-10-01Et dybdegående kig på oprettelse af applikationer med XML.Ralls, Kim... 

Læsning af en XML-fil

Lad os se på de grundlæggende trin, der kræves for at læse en XML-fil ved hjælp af DOM API.

Det første skridt er at få en instans af DocumentBuilder. Builder bruges til at parse XML-dokumenter. Til grundlæggende brug gør vi det sådan:

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); factory.setNamespaceAware (falsk); factory.setValidating (falsk); DocumentBuilder builder = factory.newDocumentBuilder(); 

Vi kan nu indlæse hele dokumentet i hukommelsen fra XML-rodelementet. I vores eksempel er det katalog element.

Fil fil =...; // XML-fil at læse. Dokumentdokument = builder.parse (fil); Elementkatalog = document.getDocumentElement(); 

Og det er det, folkens! DOM API'et til at læse en XML er virkelig simpelt. Du har nu adgang til hele XML-dokumentet fra dets rodelement, katalog. Lad os nu se, hvordan man arbejder med det.

Brug af DOM API

Nu hvor vi har XML-roden Element, kan vi bruge DOM API til at udtrække interessante klumper af information.

Få alle Bestil børn af rodelementet og løkke over dem. Noter det getChildNodes() vender tilbage alle børn, herunder tekst, kommentarer mv. Til vores formål har vi kun brug for børneelementerne, så vi springer de andre over.

NodeList books = catalog.getChildNodes(); for (int i = 0, ii = 0, n = books.getLength(); i < n; i++) { Node child = books.item (i); if ( child.getNodeType() != Node. ELEMENT_NODE ) fortsæt; Elementbog = (Element) barn; // arbejde med bogen Element her. }

Hvordan finder du et specifikt underordnet element, givet forælderen? Den følgende statiske metode returnerer det første matchende element, hvis fundet, eller null. Som du kan se, involverer proceduren at hente listen over underordnede noder og gå gennem dem og udvælge elementnoder med det angivne navn.

statisk privat node findFirstNamedElement (node ​​overordnet, String tagName) { NodeList children = parent.getChildNodes(); for (int i = 0, in = children.getLength(); i < i; i++) { Node child = children.item (i); if ( child.getNodeType() != Node. ELEMENT_NODE ) fortsæt; if ( child.getNodeName().equals (tagName) ) returner child; } returner null; }

Bemærk, at DOM API'en behandler tekstindhold i et element som en separat node af typen TEXT_NODE. Derudover kan tekstindholdet være opdelt i flere tilstødende tekstnoder. Så følgende særlige behandling er påkrævet for at hente tekstindholdet i et element.

statisk privat streng getCharacterData (knudeoverordnet) { StringBuilder text = new StringBuilder(); if (forælder == null) returner text.toString(); NodeList children = parent.getChildNodes(); for (int k = 0, kn = børn.getLængde(); k < kn; k++) { Node child = children.item (k); if ( child.getNodeType() != Node. TEXT_NODE ) pause; text.append (child.getNodeValue()); } returner text.toString(); }

Bevæbnet med disse bekvemmelighedsfunktioner, lad os nu se på noget kode for at vise nogle oplysninger fra vores eksempel-XML. Vi vil gerne vise detaljerede oplysninger for hver bog, sådan som den ville være tilgængelig i et bogkatalog.

NodeList books = catalog.getChildNodes(); for (int i = 0, ii = 0, n = books.getLength(); i < n; i++) { Node child = books.item (i); if ( child.getNodeType() != Node. ELEMENT_NODE ) fortsæt; Elementbog = (Element) barn; ii++; String id = book.getAttribute("id"); String author = getCharacterData (findFirstNamedElement (child,"author")); String title = getCharacterData (findFirstNamedElement (child,"title")); String genre = getCharacterData (findFirstNamedElement (child,"genre")); Strengpris = getCharacterData (findFirstNamedElement (child,"pris")); String pubdate = getCharacterData (findFirstNamedElement (child,"pubdate")); String descr = getCharacterData (findFirstNamedElement (child,"description")); System.out.printf("%3d. bog-id = %s\n" + " forfatter: %s\n" + " titel: %s\n" + " genre: %s\n" + " pris: %s\n" + " udgivelsesdato: %s \n" + " descr: %s\n", ii, id, forfatter, titel, genre, pris, udgivelsesdato, descr); }

Skrive XML-output

Java giver XML Transform API at transformere XML-data. Vi bruger denne API med identitetsforvandling at generere output.

Lad os som et eksempel tilføje en ny Bestil element til prøvekataloget præsenteret ovenfor. Bogens detaljer (f.eks forfatter, titelosv.) kan hentes eksternt, måske fra en egenskabsfil eller en database. Vi bruger følgende egenskabsfil til at indlæse dataene.

id=bk113. forfatter=Jane Austen. title=Stolthed og fordom. genre=romantik. pris = 6,99. publiceringsdato=2010-04-01. description="Det er en alment anerkendt sandhed, at en enlig mand i besiddelse af en lykke må mangle en hustru." Så begynder Pride og Prejudice, Jane Austens vittige komedie om manerer - en af ​​de mest populære romaner gennem tiderne - der byder på glimrende civiliseret sparring mellem den stolte Mr. Darcy og den fordomsfulde Elizabeth Bennet, mens de udspiller deres livlige frieri i en serie af 1700-tals saloner intriger. 

Det første trin er at parse den eksisterende XML-fil ved hjælp af metoden præsenteret ovenfor. Koden er også vist nedenfor.

Fil fil =...; // XML-fil at læse. Dokumentdokument = builder.parse (fil); Elementkatalog = document.getDocumentElement(); 

Vi indlæser dataene fra egenskabsfilen ved hjælp af Ejendomme klasse forsynet med java. Koden er ret simpel og vist nedenfor.

String propsFile =...; Properties props = new Properties(); try (FileReader in = new FileReader (propsFile)) { props.load (in); }

Når egenskaberne er indlæst, henter vi de værdier, vi vil tilføje, fra egenskabsfilen.

String id = props.getProperty("id"); Strengforfatter = props.getProperty("author"); String title = props.getProperty("title"); Strenggenre = props.getProperty("genre"); Strengpris = props.getProperty("pris"); String publish_date = props.getProperty("publish_date"); String descr = props.getProperty("beskrivelse"); 

Lad os nu oprette en tom Bestil element.

Elementbog = document.createElement("bog"); book.setAttribute("id", id); 

Tilføjelse af underordnede elementer til Bestil er trivielt. For nemheds skyld samler vi de nødvendige elementnavne i en Liste og tilføj værdierne i en løkke.

Listeelnames =Arrays.asList("forfatter", "titel", "genre", "pris", "udgivelsesdato", "beskrivelse"); for (String elname: elnames) { Element el = document.createElement (elname); Teksttekst = document.createTextNode (props.getProperty (elname)); el.appendBarn (tekst); bog.appendBarn (el); } catalog.appendChild (bog);

Og det er sådan det gøres. Det katalog element har nu den nye Bestil element tilføjet. Det eneste, der er tilbage nu, er at skrive den opdaterede XML ud.

For at skrive XML har vi brug for en instans af Transformer som er oprettet som vist nedenfor. Bemærk, at vi anmoder om indrykning af output-XML ved hjælp af setOutputProperty() metode.

TransformerFactory tfact = TransformerFactory.newInstance(); Transformer tform = tfact.newTransformer(); tform.setOutputProperty (OutputKeys. INDRAG, "ja"); tform.setOutputProperty("{ http://xml.apache.org/xslt}indent-amount", "3"); 

Det sidste trin i generering af XML-output er at anvende transformationen. Resultatet vises på outputstrømmen, System.ud.

tform.transform (ny DOMSource (dokument), ny StreamResult (System.out)); 

For at skrive output direkte til en fil, brug følgende.

tform.transform (ny DOMSource (dokument), ny StreamResult (ny fil("output.xml"))); 

Og det afslutter denne artikel om at læse og skrive XML-filer ved hjælp af DOM API.

Har du brugt DOM API i dine applikationer? Hvordan fungerede det? Fortæl os venligst i kommentarerne nedenfor.