Mainos

Haluatko oppia lukemaan ja kirjoittamaan XML-tiedostoja javasta?

XML-tiedostoja Mikä on XML-tiedosto ja kuinka voit avata ja käyttää sitä?Olet ehkä nähnyt termin "XML". Olet ehkä jopa vahingossa avannut XML-tiedoston. Mikä on XML ja miten sitä käytetään? Lue lisää käytetään useisiin tarkoituksiin, mukaan lukien tietojen tallentamiseen. Ennen kuin JSON tuli suosituksi, XML oli suositeltu muoto strukturoidun tiedon esittämiseen, tallentamiseen ja siirtämiseen. Vaikka XML: n suosio on hiipunut viime vuosina, saatat kohdata sitä toisinaan, joten on tärkeää oppia käyttämään sitä koodista.

Java Standard Edition (SE) 10 Java-ydinkonseptia, jotka sinun tulee oppia aloittaessasiOlitpa kirjoittamassa graafista käyttöliittymää, kehittämässä palvelinpuolen ohjelmistoja tai mobiilisovellusta Androidilla, Javan oppiminen palvelee sinua hyvin. Tässä on joitain Java-ydinkonsepteja, joiden avulla pääset alkuun. Lue lisää sisältää Java API for XML Processing (JAXP), joka on kattotermi, joka kattaa useimmat XML-käsittelyn osa-alueet. Nämä sisältävät:

instagram viewer
  • DOM: Asiakirjaobjektimalli sisältää luokkia XML-artefaktien, kuten elementin, solmun, attribuuttien jne., kanssa työskentelemiseen. DOM API lataa koko XML-asiakirjan muistiin käsittelyä varten, joten se ei sovellu kovinkaan suurien XML-tiedostojen käsittelyyn.
  • SAX: Simple API for XML on tapahtumaohjattu algoritmi XML: n lukemiseen. Tässä XML käsitellään käynnistämällä XML: ää luettaessa löydetyt tapahtumat. Tämän menetelmän käyttämisen muistivaatimukset ovat alhaiset, mutta API: n kanssa työskentely on monimutkaisempaa kuin DOM: n kanssa.
  • Stax: Streaming API for XML on uusi lisäys XML-sovellusliittymiin ja tarjoaa tehokkaan stream-suodatuksen, -käsittelyn ja XML-muokkauksen. Vaikka se välttää koko XML-asiakirjan lataamisen muistiin, se tarjoaa pikemminkin pull-tyyppisen arkkitehtuurin kuin tapahtumaohjattu arkkitehtuuri, joten sovellus on helpompi koodata ja ymmärtää kuin SAX: n käyttäminen API.

Tässä artikkelissa käytämme DOM API esitellä, kuinka lukea ja kirjoittaa XML-tiedostoja javasta. Käsittelemme kaksi muuta sovellusliittymää tulevissa artikkeleissa.

Esimerkki XML-tiedostosta

Tätä artikkelia varten esittelemme käsitteet käyttämällä seuraavaa XML-esimerkkiä, joka löytyy tässä:

 1.0?>Gambardella, MatthewXML-kehittäjän opas
Tietokone44.952000-10-01Yksityiskohtainen katsaus sovellusten luomiseen XML: llä.Ralls, Kim... 

XML-tiedoston lukeminen

Katsotaanpa perusvaiheita, joita tarvitaan XML-tiedoston lukemiseen DOM API: n avulla.

Ensimmäinen askel on saada esimerkki DocumentBuilder. Rakentajaa käytetään XML-dokumenttien jäsentämiseen. Peruskäytössä teemme sen seuraavasti:

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

Voimme nyt ladata koko asiakirjan muistiin alkaen XML-juurielementistä. Esimerkissämme se on luettelo elementti.

Tiedostotiedosto =...; // luettava XML-tiedosto. Asiakirjadokumentti = builder.parse (tiedosto); Elementtiluettelo = document.getDocumentElement(); 

Ja siinä se, hyvät ihmiset! DOM-sovellusliittymä XML: n lukemiseen on todella yksinkertainen. Sinulla on nyt pääsy koko XML-dokumenttiin sen juurielementistä alkaen, luettelo. Katsotaan nyt, miten sen kanssa työskennellään.

DOM API: n käyttö

Nyt kun meillä on XML-juuri Elementti, voimme käyttää DOM-sovellusliittymää kiinnostavien tietojen poimimiseen.

Hanki kaikki kirja juurielementin lapsia ja silmukkaa niiden yli. Ota huomioon, että getChildNodes() palaa kaikki lapset, mukaan lukien teksti, kommentit jne. Tarkoituksemme varten tarvitsemme vain lapsielementtejä, joten ohitamme muut.

NodeList books = catalog.getChildNodes(); for (int i = 0, ii = 0, n = kirjat.getLength(); i < n; i++) { Solmun lapsi = kirjat.kohde (i); if ( child.getNodeType() != Solmu. ELEMENT_SODE ) jatka; Elementtikirja = (Elementti)lapsi; // työskentele Element-kirjan kanssa täällä. }

Kuinka löydät tietyn alatason elementin vanhemman perusteella? Seuraava staattinen menetelmä palauttaa ensimmäisen vastaavan elementin, jos se löytyy, tai nollan. Kuten näet, menettelyyn kuuluu lapsisolmujen luettelon hankkiminen ja niiden läpikäyminen poimimalla elementtisolmut määritetyllä nimellä.

staattinen yksityinen solmu findFirstNamedElement (solmun ylätaso, merkkijonon nimi) { Solmuluettelon lapset = parent.getChildNodes(); for (int i = 0, in = children.getLength(); i < sisään; i++) { Solmun lapsi = lapset.kohde (i); if ( child.getNodeType() != Solmu. ELEMENT_SODE ) jatka; if ( child.getNodeName().equals (tagName) ) palauttaa lapsen; } return null; }

Huomaa, että DOM-sovellusliittymä käsittelee elementin tekstisisältöä erillisenä tyyppisolmuna TEXT_NODE. Lisäksi tekstisisältö voidaan jakaa useisiin vierekkäisiin tekstisolmuihin. Joten seuraava erikoiskäsittely vaaditaan elementin tekstisisällön hakemiseksi.

staattinen yksityinen merkkijono getCharacterData (solmupää) { StringBuilder text = new StringBuilder(); if ( vanhempi == null ) return text.toString(); Solmuluettelon lapset = parent.getChildNodes(); for (int k = 0, kn = lapset.getLength(); k < kn; k++) { Solmun lapsi = lapset.kohde (k); if ( child.getNodeType() != Solmu. TEXT_NODE ) tauko; text.append (child.getNodeValue()); } return text.toString(); }

Näillä mukavuustoiminnoilla varustettuna katsokaamme nyt koodia, jolla listataan joitain tietoja malli-XML-tiedostosta. Haluamme näyttää yksityiskohtaiset tiedot jokaisesta kirjasta, kuten ne olisivat saatavilla kirjaluettelossa.

NodeList books = catalog.getChildNodes(); for (int i = 0, ii = 0, n = kirjat.getLength(); i < n; i++) { Solmun lapsi = kirjat.kohde (i); if ( child.getNodeType() != Solmu. ELEMENT_SODE ) jatka; Elementtikirja = (Elementti)lapsi; ii++; Merkkijonon tunnus = book.getAttribute("id"); Merkkijono author = getCharacterData (findFirstNamedElement (lapsi,"author")); Merkkijonon otsikko = getCharacterData (findFirstNamedElement (lapsi,"title")); Merkkijonolaji = getCharacterData (findFirstNamedElement (lapsi"genre")); Merkkijono hinta = getCharacterData (findFirstNamedElement (lapsi,"hinta")); Merkkijono pubdate = getCharacterData (findFirstNamedElement (lapsi,"julkaiseminen")); Merkkijono descr = getCharacterData (findFirstNamedElement (lapsi"kuvaus")); System.out.printf("%3d. kirjan tunnus = %s\n" + " kirjoittaja: %s\n" + " nimike: %s\n" + " genre: %s\n" + " hinta: %s\n" + " julkaisupäivä: %s \n" + " descr: %s\n", ii, id, tekijä, nimi, genre, hinta, julkaisupäivä, descr); }

XML-tulosteen kirjoittaminen

Java tarjoaa XML Transform API XML-tietojen muuntamiseen. Käytämme tätä API: ta kanssa identiteetin muunnos tuotoksen tuottamiseksi.

Lisätään esimerkkinä uusi kirja elementti yllä esitettyyn malliluetteloon. Kirjan yksityiskohdat (esim kirjoittaja, otsikkojne.) voidaan hankkia ulkopuolelta, ehkä ominaisuustiedostosta tai tietokannasta. Käytämme tietojen lataamiseen seuraavaa ominaisuustiedostoa.

id=bk113. kirjoittaja = Jane Austen. title = Ylpeys ja ennakkoluulo. genre = Romantiikka. hinta = 6,99. julkaisupäivä=2010-04-01. description="Yleisesti tunnustettu totuus on, että naimaton mies, jolla on onni, tarvitsee vaimoa." Tästä alkaa Pride ja Ennakkoluulo, Jane Austenin nokkela käytöstapojen komedia – yksi kaikkien aikojen suosituimmista romaaneista – joka sisältää upeasti sivistynyttä sparrausta ylpeä herra Darcy ja ennakkoluuloinen Elizabeth Bennet, kun he pelaavat henkistä seurusteluaan 1700-luvun salonkisarjassa juonittelut. 

Ensimmäinen vaihe on jäsentää olemassa oleva XML-tiedosto yllä esitetyllä menetelmällä. Koodi näkyy myös alla.

Tiedostotiedosto =...; // luettava XML-tiedosto. Asiakirjadokumentti = builder.parse (tiedosto); Elementtiluettelo = document.getDocumentElement(); 

Lataamme tiedot ominaisuustiedostosta käyttämällä Ominaisuudet luokka javalla. Koodi on melko yksinkertainen ja näkyy alla.

Merkkijono propsFile =...; Ominaisuudet props = new Properties(); try (FileReader in = uusi FileReader (propsFile)) { props.load (in); }

Kun ominaisuudet on ladattu, haemme lisättävät arvot ominaisuustiedostosta.

Merkkijonon tunnus = props.getProperty("id"); Merkkijono author = props.getProperty("author"); Merkkijonon otsikko = props.getProperty("title"); Merkkijonolaji = props.getProperty("genre"); Merkkijono hinta = props.getProperty("hinta"); Merkkijono julkaisupäivä = props.getProperty("julkaisupäivä"); Merkkijono descr = props.getProperty("description"); 

Luodaan nyt tyhjä kirja elementti.

Elementtikirja = document.createElement("kirja"); book.setAttribute("id", id); 

Lapsielementtien lisääminen kirja on triviaalia. Mukavuuden vuoksi keräämme tarvittavat elementin nimet kohtaan a Lista ja lisää arvot silmukassa.

Listaelnames =Arrays.asList("tekijä", "nimi", "genre", "hinta", "julkaisupäivämäärä", "kuvaus"); for (merkkijono elname: elnames) { Elementti el = document.createElement (elname); Tekstiteksti = document.createTextNode (props.getProperty (elname)); el.appendChild (teksti); book.appendChild (el); } catalog.appendChild (kirja);

Ja näin se tehdään. The luettelo elementillä on nyt uusi kirja elementti lisätty. Nyt on vain kirjoitettava päivitetty XML.

XML: n kirjoittamista varten tarvitsemme esiintymän Muuntaja joka luodaan alla olevan kuvan mukaisesti. Huomaa, että pyydämme tulostetun XML: n sisennystä käyttämällä setOutputProperty() menetelmä.

TransformerFactory tfact = TransformerFactory.newInstance(); Muuntaja tform = tfact.newTransformer(); tform.setOutputProperty (OutputKeys. SISÄLTÖ, "kyllä"); tform.setOutputProperty("{ http://xml.apache.org/xslt}indent-amount", "3"); 

Viimeinen vaihe XML-tulosteen luomisessa on muunnoksen soveltaminen. Tulos näkyy ulostulovirrassa, System.out.

tform.transform (uusi DOMSource (asiakirja), uusi StreamResult (System.out)); 

Jos haluat kirjoittaa tulosteen suoraan tiedostoon, käytä seuraavaa.

tform.transform (uusi DOMSource (asiakirja), uusi StreamResult (uusi tiedosto("output.xml"))); 

Ja tämä päättää tämän artikkelin XML-tiedostojen lukemisesta ja kirjoittamisesta DOM-sovellusliittymän avulla.

Oletko käyttänyt DOM API: ta sovelluksissasi? Miten se suoriutui? Kerro meille alla olevissa kommenteissa.