Skelbimas

Ar norėtumėte išmokti skaityti ir rašyti XML failą iš Java?

XML failai Kas yra XML failas ir kaip jį atidaryti ir naudoti?Galbūt matėte terminą „XML“. Galbūt net netyčia atidarėte XML failą. Kas yra XML ir kaip jį naudoti? Skaityti daugiau yra naudojami įvairiems tikslams, įskaitant duomenų saugojimą. Prieš išpopuliarėjant JSON, XML buvo pageidaujamas struktūrinių duomenų pateikimo, saugojimo ir transportavimo formatas. Nors XML populiarumas pastaraisiais metais sumažėjo, kartais galite su ja susidurti, todėl svarbu išmokti dirbti su ja naudojant kodą.

„Java Standard Edition“ (SE) 10 pagrindinių „Java“ sąvokų, kurių turėtumėte išmokti pradedantNesvarbu, ar rašote grafinę sąsają, kuriate serverio programinę įrangą ar mobiliąją programą naudodami „Android“, „Java“ mokymasis jums pasitarnaus. Štai keletas pagrindinių „Java“ koncepcijų, kurios padės jums pradėti. Skaityti daugiau apima „Java“ API, skirta XML apdorojimui (JAXP), kuris yra bendras terminas, apimantis daugumą XML apdorojimo aspektų. Jie apima:

instagram viewer
  • DOM: Dokumento objekto modelis apima klases, skirtas dirbti su XML artefaktais, tokiais kaip elementas, mazgas, atributai ir kt. DOM API įkelia visą XML dokumentą į atmintį apdorojimui, todėl ji nėra labai tinkama darbui su dideliais XML failais.
  • SAX: Simple API for XML yra įvykiais pagrįstas XML skaitymo algoritmas. Čia XML apdorojamas suaktyvinant įvykius, rastus skaitant XML. Atminties poreikis naudojant šį metodą yra mažas, tačiau dirbti su API yra sudėtingiau nei dirbti su DOM.
  • Stax: Srautinio perdavimo API, skirta XML, yra naujausias XML API papildymas ir užtikrina didelio našumo srauto filtravimą, apdorojimą ir XML modifikavimą. Nors išvengiama viso XML dokumento įkėlimo į atmintį, ji veikiau suteikia ištraukimo tipo architektūrą nei įvykiais pagrįsta architektūra, todėl programą lengviau koduoti ir suprasti nei naudojant SAX API.

Šiame straipsnyje mes naudojame DOM API parodyti, kaip skaityti ir rašyti XML failus iš Java. Kitus du API aptarsime būsimuose straipsniuose.

XML failo pavyzdys

Šiame straipsnyje mes demonstruojame sąvokas naudodami toliau pateiktą XML pavyzdį, kurį galima rasti čia:

 1.0?>Gambardella, MatthewXML kūrėjo vadovas
Kompiuteris44.952000-10-01Išsamus programų kūrimo naudojant XML vaizdas.Ralls, Kim... 

XML failo skaitymas

Pažvelkime į pagrindinius veiksmus, kurių reikia norint nuskaityti XML failą naudojant DOM API.

Pirmas žingsnis yra gauti pavyzdį DocumentBuilder. Kūrėjas naudojamas XML dokumentams analizuoti. Pagrindiniam naudojimui mes tai darome taip:

DocumentBuilderFactory gamykla = DocumentBuilderFactory.newInstance(); factory.setNamespaceAware (false); factory.setValidating (false); DocumentBuilder kūrimo priemonė = factory.newDocumentBuilder(); 

Dabar galime įkelti visą dokumentą į atmintį, pradedant nuo XML šakninio elemento. Mūsų pavyzdyje tai yra katalogą elementas.

Failo failas =...; // Skaitytinas XML failas. Dokumento dokumentas = builder.parse (failas); Elementų katalogas = document.getDocumentElement(); 

Ir viskas, žmonės! DOM API, skirta skaityti XML, yra labai paprasta. Dabar turite prieigą prie viso XML dokumento, pradedant nuo pagrindinio elemento, katalogą. Dabar pažiūrėkime, kaip su juo dirbti.

Naudojant DOM API

Dabar, kai turime XML šaknį Elementas, galime naudoti DOM API norėdami išgauti įdomius informacijos grynuolius.

Gaukite visus knyga šakninio elemento vaikai ir kilpa per juos. Prisimink tai getChildNodes() grįžta visi vaikai, įskaitant tekstą, komentarus ir kt. Mūsų tikslams mums reikia tik vaikų elementų, todėl praleidžiame kitus.

NodeList knygos = katalogas.getChildNodes(); for (int i = 0, ii = 0, n = knygos.getLength(); i < n; i++) { Mazgas vaikas = knygos.elementas (i); if ( vaikas.getNodeType() != Mazgas. ELEMENT_NODE ) tęsti; Elementų knyga = (Elemento) vaikas; // dirbkite su knyga Elementas čia. }

Kaip rasti konkretų antrinį elementą, atsižvelgiant į tėvą? Šis statinis metodas grąžina pirmąjį atitinkantį elementą, jei rastas, arba nulį. Kaip matote, procedūra apima antrinių mazgų sąrašo gavimą ir jų peržiūrą, pasirenkant elementų mazgus nurodytu pavadinimu.

statinis privatus Mazgas findFirstNamedElement (mazgo pirminis elementas, eilutės žymos pavadinimas) { Mazgų sąrašo vaikai = tėvas.getChildNodes(); for (int i = 0, in = vaikai.getLength(); i < in; i++) { Mazgas vaikas = vaikai.elementas (i); if ( vaikas.getNodeType() != Mazgas. ELEMENT_NODE ) tęsti; if ( child.getNodeName().equals (tagName) ) return vaikas; } return null; }

Atminkite, kad DOM API elemento tekstinį turinį traktuoja kaip atskirą tipo mazgą TEXT_NODE. Be to, teksto turinys gali būti padalytas į kelis gretimus teksto mazgus. Taigi, norint gauti elemento teksto turinį, reikalingas šis specialus apdorojimas.

statinė privati ​​eilutė getCharacterData (mazgo pirminis) { StringBuilder tekstas = new StringBuilder(); if ( tėvas == null ) return text.toString(); Mazgų sąrašo vaikai = tėvas.getChildNodes(); for (int k = 0, kn = vaikai.getLength(); k < kn; k++) { Mazgas vaikas = vaikai.elementas (k); if ( vaikas.getNodeType() != Mazgas. TEXT_NODE ) pertrauka; text.append (child.getNodeValue()); } return text.toString(); }

Pasinaudoję šiomis patogumo funkcijomis, pažvelkime į kodą, skirtą informacijai iš mūsų pavyzdinio XML. Norėtume parodyti išsamią informaciją apie kiekvieną knygą, tokią, kokią būtų galima rasti knygų kataloge.

NodeList knygos = katalogas.getChildNodes(); for (int i = 0, ii = 0, n = knygos.getLength(); i < n; i++) { Mazgas vaikas = knygos.elementas (i); if ( vaikas.getNodeType() != Mazgas. ELEMENT_NODE ) tęsti; Elementų knyga = (Elemento) vaikas; ii++; String id = book.getAttribute("id"); Eilutės autorius = getCharacterData (findFirstNamedElement (vaikas,"author")); Eilutės pavadinimas = getCharacterData (findFirstNamedElement (child,"title")); Stygos žanras = getCharacterData (findFirstNamedElement (vaikas,"žanras")); Eilutės kaina = getCharacterData (findFirstNamedElement (child,"price")); Eilutė pubdate = getCharacterData (findFirstNamedElement (vaikas,"pubdate")); Eilutė descr = getCharacterData (findFirstNamedElement (vaikas,"aprašas")); System.out.printf("%3d. knygos ID = %s\n" + " autorius: %s\n" + " pavadinimas: %s\n" + " žanras: %s\n" + " kaina: %s\n" + " išleidimo data: %s \n" + " descr: %s\n", ii, id, autorius, pavadinimas, žanras, kaina, paskelbimo data, aprašas); }

XML išvesties rašymas

„Java“ suteikia XML transformavimo API transformuoti XML duomenis. Mes naudojame šią API su tapatybės transformacija išvesties generavimui.

Kaip pavyzdį, pridėkime naują knyga elementą į aukščiau pateiktą pavyzdinį katalogą. Išsami informacija apie knygą (pvz autorius, tituląir tt) galima gauti iš išorės, galbūt iš ypatybių failo arba duomenų bazės. Duomenims įkelti naudojame šį ypatybių failą.

id=bk113. autorė = Jane Austen. title = Puikybė ir prietarai. žanras = Romantika. kaina = 6,99. publikavimo_data=2010-04-01. description="Visuotinai pripažįstama tiesa, kad vienišas vyras, turintis sėkmę, turi trūkti žmonos." Taip prasideda Pride ir „Prejudice“, šmaikšti Jane Austen manierų komedija – vienas populiariausių visų laikų romanų, pasižymintis nuostabiu civilizuotu sparingu tarp išdidus ponas Darcy ir išankstinių nusistatymų nusiteikusi Elizabeth Bennet, kai jie linksmai bendrauja aštuonioliktojo amžiaus svetainės serijoje intrigos. 

Pirmas žingsnis yra išanalizuoti esamą XML failą naudojant aukščiau pateiktą metodą. Kodas taip pat rodomas žemiau.

Failo failas =...; // Skaitytinas XML failas. Dokumento dokumentas = builder.parse (failas); Elementų katalogas = document.getDocumentElement(); 

Įkeliame duomenis iš ypatybių failo naudodami Savybės klasė aprūpinta java. Kodas yra gana paprastas ir parodytas žemiau.

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

Įkėlus ypatybes, iš ypatybių failo gauname norimas pridėti reikšmes.

String id = props.getProperty("id"); Eilutės autorius = props.getProperty("autorius"); Eilutės pavadinimas = props.getProperty("title"); Styginių žanras = props.getProperty("žanras"); Eilutės kaina = props.getProperty("kaina"); Eilutė publikavimo_data = props.getProperty("publikavimo_data"); Eilutė descr = props.getProperty("description"); 

Dabar sukurkime tuščią knyga elementas.

Element book = document.createElement("knyga"); book.setAttribute("id", id); 

Vaikų elementų pridėjimas prie knyga yra trivialus. Kad būtų patogiau, surenkame reikiamus elementų pavadinimus į a Sąrašas ir pridėti vertes cikle.

Sąrašaselnames =Arrays.asList("autorius", "pavadinimas", "žanras", "kaina", "publikavimo_data", "aprašymas"); for (Eilutė elname: elnames) { Element el = document.createElement (elname); Teksto tekstas = document.createTextNode (props.getProperty (elname)); el.appendChild (tekstas); knyga.appendChild (el); } katalogas.appendChild (knyga);

Ir taip tai daroma. The katalogą elementas dabar turi naują knyga pridėtas elementas. Dabar belieka išrašyti atnaujintą XML.

Norėdami parašyti XML, mums reikia egzemplioriaus Transformatorius kuris sukurtas taip, kaip parodyta toliau. Atkreipkite dėmesį, kad reikalaujame išvesties XML įtraukos naudodami setOutputProperty() metodas.

TransformerFactory tfact = TransformerFactory.newInstance(); Transformatorius tform = tfact.newTransformer(); tform.setOutputProperty (OutputKeys. ĮTRAUKA, "taip"); tform.setOutputProperty("{ http://xml.apache.org/xslt}indent-amount", "3"); 

Paskutinis žingsnis generuojant XML išvestį yra transformacijos pritaikymas. Rezultatas rodomas išvesties sraute, System.out.

tform.transform (naujas DOMSource (dokumentas), naujas StreamResult (System.out)); 

Norėdami įrašyti išvestį tiesiai į failą, naudokite šiuos veiksmus.

tform.transform (naujas DOMSource (dokumentas), naujas StreamResult (naujas failas("output.xml"))); 

Tai užbaigia šį straipsnį apie XML failų skaitymą ir rašymą naudojant DOM API.

Ar savo programose naudojote DOM API? Kaip jis pasirodė? Praneškite mums toliau pateiktose pastabose.