Reklāma

Vai vēlaties iemācīties lasīt un rakstīt XML failu no java?

XML faili Kas ir XML fails un kā to atvērt un izmantot?Iespējams, esat redzējis terminu "XML". Iespējams, pat nejauši esat atvēris XML failu. Kas ir XML un kā to izmantot? Lasīt vairāk tiek izmantoti dažādiem mērķiem, tostarp datu uzglabāšanai. Pirms JSON kļuva populārs, XML bija vēlamais formāts strukturētu datu attēlošanai, glabāšanai un transportēšanai. Lai gan XML popularitāte pēdējos gados ir mazinājusies, dažkārt ar to var saskarties, tāpēc ir svarīgi iemācīties strādāt ar to no koda.

Java standarta izdevums (SE) 10 Java pamatjēdzieni, kas jums jāapgūst, sākot darbuNeatkarīgi no tā, vai rakstāt GUI, izstrādājat servera puses programmatūru vai mobilo lietojumprogrammu, izmantojot Android, Java apguve jums noderēs. Šeit ir daži Java pamatjēdzieni, kas palīdzēs sākt darbu. Lasīt vairāk ietver Java API XML apstrādei (JAXP), kas ir vispārīgs termins, kas aptver lielāko daļu XML apstrādes aspektu. Tie ietver:

  • DOM: Dokumenta objektu modelī ir iekļautas klases darbam ar XML artefaktiem, piemēram, elementu, mezglu, atribūtiem utt. DOM API ielādē visu XML dokumentu atmiņā apstrādei, tāpēc tas nav īpaši piemērots darbam ar lieliem XML failiem.
  • SAX: Simple API for XML ir uz notikumiem balstīts algoritms XML lasīšanai. Šeit XML tiek apstrādāts, aktivizējot notikumus, kas atrasti, lasot XML. Atmiņas prasības šīs metodes izmantošanai ir zemas, taču darbs ar API ir sarežģītāks nekā darbs ar DOM.
  • Stax: Straumēšanas API XML ir nesens XML API papildinājums un nodrošina augstas veiktspējas straumes filtrēšanu, apstrādi un XML modifikāciju. Lai gan tas ļauj izvairīties no visa XML dokumenta ielādes atmiņā, tas drīzāk nodrošina vilkšanas tipa arhitektūru nekā uz notikumu balstīta arhitektūra, tāpēc lietojumprogrammu ir vieglāk kodēt un saprast, nekā izmantojot SAX API.

Šajā rakstā mēs izmantojam DOM API lai parādītu, kā lasīt un rakstīt XML failus no java. Nākamajos rakstos mēs apskatīsim pārējās divas API.

XML faila paraugs

Šajā rakstā mēs demonstrējam jēdzienus, izmantojot šādu XML paraugu, ko var atrast šeit:

 1.0?>Gambardella, MetjūXML izstrādātāja rokasgrāmata
Dators44.952000-10-01Padziļināts ieskats lietojumprogrammu veidošanā ar XML.Ralls, Kim... 

XML faila lasīšana

Apskatīsim pamata darbības, kas nepieciešamas XML faila lasīšanai, izmantojot DOM API.

Pirmais solis ir iegūt piemēru DocumentBuilder. Veidotājs tiek izmantots XML dokumentu parsēšanai. Pamata lietošanai mēs to darām šādi:

DocumentBuilderFactory rūpnīca = DocumentBuilderFactory.newInstance(); factory.setNamespaceAware (false); factory.setValidating (false); DocumentBuilder veidotājs = factory.newDocumentBuilder(); 

Tagad mēs varam ielādēt visu dokumentu atmiņā, sākot no XML saknes elementa. Mūsu piemērā tas ir katalogu elements.

Faila fails =...; // lasāmais XML fails. Dokumenta dokuments = builder.parse (fails); Elementu katalogs = document.getDocumentElement(); 

Un tas arī viss, ļaudis! DOM API XML lasīšanai ir ļoti vienkārša. Tagad jums ir piekļuve visam XML dokumentam, sākot no tā saknes elementa, katalogu. Tagad redzēsim, kā ar to strādāt.

Izmantojot DOM API

Tagad, kad mums ir XML sakne Elements, mēs varam izmantot DOM API, lai iegūtu interesantus informācijas tīrradņus.

Iegūstiet visu grāmatu saknes elementa bērnus un cilpu pār tiem. Pieraksti to getChildNodes() atgriežas visi bērni, ieskaitot tekstu, komentārus utt. Mūsu mērķim mums ir nepieciešami tikai bērna elementi, tāpēc mēs izlaižam citus.

NodeList grāmatas = katalogs.getChildNodes(); for (int i = 0, ii = 0, n = grāmatas.getLength(); i < n; i++) { Mezgls bērns = grāmatas.vienums (i); if ( bērns.getNodeType() != Mezgls. ELEMENT_NODE ) turpināt; Elementa grāmata = (Elementa) bērns; // strādājiet ar grāmatu Elements šeit. }

Kā atrast konkrētu bērna elementu, ņemot vērā vecāku? Tālāk norādītā statiskā metode atgriež pirmo atbilstošo elementu, ja tas ir atrasts, vai nulle. Kā redzat, procedūra ietver pakārtoto mezglu saraksta iegūšanu un cilpu caur tiem, izvēloties elementu mezglus ar norādīto nosaukumu.

statisks privāts mezgls findFirstNamedElement (mezgla vecāks, virknes tagName) { NodeList bērni = parent.getChildNodes(); for (int i = 0, in = children.getLength(); i < iekšā; i++) { Mezgla bērns = bērni.vienums (i); if ( bērns.getNodeType() != Mezgls. ELEMENT_NODE ) turpināt; if ( child.getNodeName().equals (tagName) ) atgriež bērnu; } return null; }

Ņemiet vērā, ka DOM API apstrādā teksta saturu elementā kā atsevišķu tipa mezglu TEXT_NODE. Turklāt teksta saturs var tikt sadalīts vairākos blakus esošajos teksta mezglos. Tātad, lai ienest teksta saturu elementā, ir nepieciešama šāda īpaša apstrāde.

statiska privāta virkne getCharacterData (mezgla vecākais) { StringBuilder teksts = new StringBuilder(); if ( vecāks == null ) return text.toString(); NodeList bērni = parent.getChildNodes(); for (int k = 0, kn = bērni.getLength(); k < kn; k++) { Mezgla bērns = bērni.vienums (k); if ( bērns.getNodeType() != Mezgls. TEXT_NODE ) pārtraukums; text.append (child.getNodeValue()); } return text.toString(); }

Apbruņojoties ar šīm ērtībām, apskatīsim kodu, lai uzskaitītu informāciju no mūsu XML parauga. Mēs vēlētos parādīt detalizētu informāciju par katru grāmatu, piemēram, tādu, kāda būtu pieejama grāmatu katalogā.

NodeList grāmatas = katalogs.getChildNodes(); for (int i = 0, ii = 0, n = grāmatas.getLength(); i < n; i++) { Mezgls bērns = grāmatas.vienums (i); if ( bērns.getNodeType() != Mezgls. ELEMENT_NODE ) turpināt; Elementa grāmata = (Elementa) bērns; ii++; String id = book.getAttribute("id"); Virknes autors = getCharacterData (findFirstNamedElement (bērns,"autors")); Virknes virsraksts = getCharacterData (findFirstNamedElement (bērns,"title")); Virknes žanrs = getCharacterData (findFirstNamedElement (bērns,"žanrs")); Virknes cena = getCharacterData (findFirstNamedElement (bērns,"price")); Virkne pubdate = getCharacterData (findFirstNamedElement (bērns,"pubdate")); Virkne descr = getCharacterData (findFirstNamedElement (bērns,"apraksts")); System.out.printf("%3d. grāmatas id = %s\n" + " autors: %s\n" + " nosaukums: %s\n" + " žanrs: %s\n" + " cena: %s\n" + " publicēšanas datums: %s \n" + " descr: %s\n", ii, id, autors, nosaukums, žanrs, cena, publicēšanas datums, descr); }

XML izvades rakstīšana

Java nodrošina XML Transform API lai pārveidotu XML datus. Mēs izmantojam šo API ar identitātes transformācija lai radītu izlaidi.

Piemēram, pievienosim jaunu grāmatu elementu iepriekš parādītajam parauga katalogam. Sīkāka informācija par grāmatu (piemēram, autors, virsrakstsuc) var iegūt ārēji, iespējams, no rekvizītu faila vai datu bāzes. Mēs izmantojam šādu rekvizītu failu, lai ielādētu datus.

id=bk113. autors=Džeina Ostina. title=Lepnums un aizspriedumi. žanrs=romantika. cena=6,99. publicēšanas_datums=2010-04-01. description="Tā ir vispāratzīta patiesība, ka vienam vīrietim, kuram ir veiksme, noteikti trūkst sievas." Tā sākas praids un Aizspriedumi, Džeinas Ostinas asprātīgā komēdija par manierēm — viens no visu laiku populārākajiem romāniem, kurā ir lieliski civilizēti sparingi starp lepnais Dārsija kungs un aizspriedumainā Elizabete Benneta, kad viņi izspēlē savu garīgo pieklājību astoņpadsmitā gadsimta viesistabas sērijā intrigas. 

Pirmais solis ir parsēt esošo XML failu, izmantojot iepriekš aprakstīto metodi. Kods ir parādīts arī zemāk.

Faila fails =...; // lasāmais XML fails. Dokumenta dokuments = builder.parse (fails); Elementu katalogs = document.getDocumentElement(); 

Mēs ielādējam datus no rekvizītu faila, izmantojot Īpašības klase nodrošināta ar java. Kods ir diezgan vienkāršs un parādīts zemāk.

String propsFile =...; Properties props = new Properties(); mēģināt (FileReader in = jauns FileReader (propsFile)) { props.load (in); }

Kad rekvizīti ir ielādēti, mēs izgūstam vērtības, kuras vēlamies pievienot no rekvizītu faila.

Virknes id = props.getProperty("id"); Virknes autors = props.getProperty("autors"); Virknes nosaukums = props.getProperty("title"); Virknes žanrs = props.getProperty("žanrs"); Virknes cena = props.getProperty("cena"); Virkne publicēšanas_datums = props.getProperty("publicēšanas_datums"); Virkne descr = props.getProperty("apraksts"); 

Tagad izveidosim tukšu grāmatu elements.

Elementa grāmata = document.createElement("grāmata"); book.setAttribute("id", id); 

Bērnu elementu pievienošana grāmatu ir triviāls. Ērtības labad mēs apkopojam nepieciešamos elementu nosaukumus a Saraksts un pievienojiet vērtības cilpā.

Sarakstselnames =Arrays.asList("autors", "nosaukums", "žanrs", "cena", "publicēšanas_datums", "apraksts"); for (String elname: elnames) { Element el = document.createElement (elname); Teksta teksts = document.createTextNode (props.getProperty (elname)); el.appendChild (teksts); book.appendChild (el); } katalogs.appendChild (grāmata);

Un tā tas tiek darīts. The katalogu elementam tagad ir jaunais grāmatu pievienots elements. Tagad atliek tikai izrakstīt atjaunināto XML.

Lai rakstītu XML, mums ir nepieciešams gadījums Transformators kas ir izveidots, kā parādīts zemāk. Ņemiet vērā, ka mēs pieprasām izvades XML atkāpi, izmantojot setOutputProperty() metodi.

TransformerFactory tfact = TransformerFactory.newInstance(); Transformators tform = tfact.newTransformer(); tform.setOutputProperty (OutputKeys. IESKAITE, "jā"); tform.setOutputProperty("{ http://xml.apache.org/xslt}indent-amount", "3"); 

Pēdējais solis XML izvades ģenerēšanā ir transformācijas pielietošana. Rezultāts tiek parādīts izvades straumē, System.out.

tform.transform (jauns DOMSource (dokuments), jauns StreamResult (System.out)); 

Lai rakstītu izvadi tieši failā, izmantojiet tālāk norādīto.

tform.transform (jauns DOMSource (dokuments), jauns StreamResult (jauns fails("output.xml"))); 

Un tas beidz šo rakstu par XML failu lasīšanu un rakstīšanu, izmantojot DOM API.

Vai savās lietojumprogrammās esat izmantojis DOM API? Kā tas veicās? Lūdzu, informējiet mūs tālāk sniegtajos komentāros.