Annonse

Vil du lære hvordan du leser og skriver en XML-fil fra java?

XML-filer Hva er en XML-fil og hvordan kan du åpne og bruke den?Du har kanskje sett begrepet "XML." Du kan til og med ha åpnet en XML-fil ved et uhell. Hva er XML og hvordan bruker du det? Les mer brukes til en rekke formål, inkludert lagring av data. Før JSON ble populær, var XML det foretrukne formatet for å representere, lagre og transportere strukturerte data. Selv om populariteten til XML har avtatt de siste årene, kan du støte på det av og til, så det er viktig å lære å jobbe med det fra kode.

Java Standard Edition (SE) 10 kjerne Java-konsepter du bør lære når du kommer i gangEnten du skriver en GUI, utvikler programvare på serversiden eller en mobilapplikasjon som bruker Android, vil det å lære Java tjene deg godt. Her er noen kjerne Java-konsepter for å hjelpe deg i gang. Les mer inkluderer Java API for XML-behandling (JAXP), som er et paraplybegrep som dekker de fleste aspekter ved XML-behandling. Disse inkluderer:

  • DOM: Dokumentobjektmodellen inkluderer klasser for arbeid med XML-artefakter som element, node, attributter, etc. DOM API laster hele XML-dokumentet inn i minnet for behandling, så det er lite egnet for arbeid med store XML-filer.
  • SAX: Simple API for XML er en hendelsesdrevet algoritme for lesing av XML. Her behandles XML ved å utløse hendelser funnet ved lesing av XML. Minnekravene for å bruke denne metoden er lave, men å jobbe med API er mer komplekst enn å jobbe med DOM.
  • StAX: Streaming API for XML er et nylig tillegg til XML APIer og gir høyytelses strømfiltrering, prosessering og modifikasjon av XML. Selv om det unngår å laste hele XML-dokumentet inn i minnet, gir det en pull-type arkitektur snarere enn en hendelsesdrevet arkitektur, så applikasjonen er lettere å kode og forstå enn å bruke SAX API.

I denne artikkelen bruker vi DOM API for å demonstrere hvordan du leser og skriver XML-filer fra java. Vi vil dekke de to andre API-ene i fremtidige artikler.

Eksempel på XML-fil

For formålet med denne artikkelen demonstrerer vi konseptene ved å bruke følgende eksempel-XML, som du kan finne her:

 1.0?>Gambardella, MatthewXML-utviklerveiledning
Datamaskin44.952000-10-01En grundig titt på å lage applikasjoner med XML.Ralls, Kim... 

Lese en XML-fil

La oss se på de grunnleggende trinnene som kreves for å lese en XML-fil ved hjelp av DOM API.

Det første trinnet er å få en forekomst av DocumentBuilder. Byggeren brukes til å analysere XML-dokumenter. For grunnleggende bruk gjør vi det slik:

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); factory.setNamespaceAware (false); factory.setValidating (false); DocumentBuilder Builder = factory.newDocumentBuilder(); 

Vi kan nå laste hele dokumentet inn i minnet fra XML-rotelementet. I vårt eksempel er det katalog element.

Fil fil =...; // XML-fil å lese. Dokumentdokument = builder.parse (fil); Elementkatalog = document.getDocumentElement(); 

Og det er det, folkens! DOM API for å lese en XML er veldig enkelt. Du har nå tilgang til hele XML-dokumentet fra rotelementet, katalog. La oss nå se hvordan vi jobber med det.

Bruker DOM API

Nå som vi har XML-roten Element, kan vi bruke DOM API for å trekke ut interessante mengde informasjon.

Få alle bok barn av rotelementet og løkke over dem. Noter det getChildNodes() returnerer alle barn, inkludert tekst, kommentarer osv. Til vårt formål trenger vi bare barneelementene, så vi hopper over de andre.

NodeList books = catalog.getChildNodes(); for (int i = 0, ii = 0, n = books.getLength(); i < n; i++) { Nodebarn = books.item (i); if ( child.getNodeType() != Node. ELEMENT_NODE ) fortsett; Elementbok = (Element) barn; // jobb med boken Element her. }

Hvordan finner du et spesifikt underordnet element, gitt forelderen? Den følgende statiske metoden returnerer det første samsvarende elementet hvis funnet, eller null. Som du kan se, innebærer prosedyren å hente listen over underordnede noder og gå gjennom dem og plukke ut elementnoder med det angitte navnet.

statisk privat node findFirstNamedElement (nodeoverordnet, strengtagnavn) { NodeList children = parent.getChildNodes(); for (int i = 0, in = children.getLength(); jeg < i; i++) { Node barn = barn.element (i); if ( child.getNodeType() != Node. ELEMENT_NODE ) fortsett; if ( child.getNodeName().equals (tagName) ) returner child; } returner null; }

Merk at DOM API behandler tekstinnhold i et element som en separat node av typen TEXT_NODE. I tillegg kan tekstinnholdet deles opp i flere tilstøtende tekstnoder. Så følgende spesialbehandling kreves for å hente tekstinnholdet i et element.

statisk privat streng getCharacterData (nodeoverordnet) { StringBuilder text = new StringBuilder(); if ( overordnet == null ) returner text.toString(); NodeList children = parent.getChildNodes(); for (int k = 0, kn = children.getLength(); k < kn; k++) { Node barn = barn.element (k); if ( child.getNodeType() != Node. TEXT_NODE ) pause; text.append (child.getNodeValue()); } returner text.toString(); }

Bevæpnet med disse bekvemmelighetsfunksjonene, la oss nå se på litt kode for å liste ut informasjon fra eksempel-XML. Vi ønsker å vise detaljert informasjon for hver bok, slik som vil være tilgjengelig i en bokkatalog.

NodeList books = catalog.getChildNodes(); for (int i = 0, ii = 0, n = books.getLength(); i < n; i++) { Nodebarn = books.item (i); if ( child.getNodeType() != Node. ELEMENT_NODE ) fortsett; Elementbok = (Element) barn; ii++; String id = book.getAttribute("id"); String author = getCharacterData (findFirstNamedElement (barn,"forfatter")); String title = getCharacterData (findFirstNamedElement (barn,"tittel")); String sjanger = getCharacterData (findFirstNamedElement (barn,"sjanger")); Strengpris = getCharacterData (findFirstNamedElement (underordnet,"pris")); String pubdate = getCharacterData (findFirstNamedElement (barn,"pubdate")); String descr = getCharacterData (findFirstNamedElement (barn,"beskrivelse")); System.out.printf("%3d. bok-ID = %s\n" + " forfatter: %s\n" + " tittel: %s\n" + " sjanger: %s\n" + " pris: %s\n" + " publiseringsdato: %s \n" + " descr: %s\n", ii, id, forfatter, tittel, sjanger, pris, publiseringsdato, descr); }

Skrive XML-utdata

Java gir XML Transform API å transformere XML-data. Vi bruker denne APIen med identitetsforvandling å generere utgang.

Som et eksempel, la oss legge til en ny bok element til prøvekatalogen presentert ovenfor. Detaljene i boken (som f.eks forfatter, tittel, etc) kan fås eksternt, kanskje fra en egenskapsfil eller en database. Vi bruker følgende egenskapsfil for å laste inn dataene.

id=bk113. forfatter=Jane Austen. title=Stolthet og fordommer. sjanger=romantikk. pris=6,99. publiseringsdato=2010-04-01. description="Det er en sannhet som er allment anerkjent at en enslig mann i besittelse av en lykke må mangle en kone." Så begynner Pride og Prejudice, Jane Austens vittige komedie om oppførsel – en av tidenes mest populære romaner – som har en fantastisk sivilisert sparring mellom den stolte Mr. Darcy og den fordomsfulle Elizabeth Bennet mens de spiller ut sitt livlige frieri i en serie salonger fra det attende århundre. intriger. 

Det første trinnet er å analysere den eksisterende XML-filen ved å bruke metoden presentert ovenfor. Koden vises også nedenfor.

Fil fil =...; // XML-fil å lese. Dokumentdokument = builder.parse (fil); Elementkatalog = document.getDocumentElement(); 

Vi laster inn dataene fra egenskapsfilen ved hjelp av Egenskaper klasse utstyrt med java. Koden er ganske enkel og vist nedenfor.

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

Når egenskapene er lastet, henter vi verdiene vi ønsker å legge til fra egenskapsfilen.

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

La oss nå lage en tom bok element.

Elementbok = document.createElement("bok"); book.setAttribute("id", id); 

Legge til underordnede elementer til bok er trivielt. For enkelhets skyld samler vi de nødvendige elementnavnene i en Liste og legg til verdiene i en løkke.

Listeelnames =Arrays.asList("forfatter", "tittel", "sjanger", "pris", "publiseringsdato", "beskrivelse"); for (String elname: elnames) { Element el = document.createElement (elname); Teksttekst = document.createTextNode (props.getProperty (elname)); el.appendChild (tekst); book.appendBarn (el); } catalog.appendChild (bok);

Og det er slik det gjøres. De katalog element har nå den nye bok element lagt til. Alt som gjenstår nå er å skrive ut den oppdaterte XML-en.

For å skrive XML trenger vi en forekomst av Transformator som er opprettet som vist nedenfor. Merk at vi ber om innrykk av utdata-XML ved å bruke setOutputProperty() metode.

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

Det siste trinnet i å generere XML-utdata er å bruke transformasjonen. Resultatet vises på utdatastrømmen, System.ut.

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

For å skrive utdataene direkte til en fil, bruk følgende.

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

Og det avslutter denne artikkelen om lesing og skriving av XML-filer ved hjelp av DOM API.

Har du brukt DOM API i applikasjonene dine? Hvordan presterte den? Gi oss beskjed i kommentarene nedenfor.