Sådan læses og skrives XML-filer med kode

  • Mark Lucas
  • 0
  • 3165
  • 92
Reklame

Ønsker du 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? Hvad er en XML-fil, og hvordan kan du åbne og bruge den? Du har muligvis set udtrykket "XML." Du har måske endda ved et uheld åbnet en XML-fil. Hvad er XML, og hvordan bruger du det? bruges til en række forskellige formål, herunder lagring af data. Inden JSON blev populær, var XML det foretrukne format til repræsentation, lagring og transport af strukturerede data. Selvom XML's popularitet er aftaget i de senere år, kan du støde på det lejlighedsvis, så det er vigtigt at lære at arbejde med det ud fra kode.

Java Standard Edition (SE) 10 Core Java-koncepter, du skal lære, når du kommer i gang 10 Core Java-koncepter, du bør lære, når du kommer i gang Uanset om du skriver et GUI, udvikler serversiden software eller en mobil applikation ved hjælp af Android, lærer Java at tjene dig godt. Her er nogle centrale Java-koncepter, der hjælper dig med at komme i gang. inkluderer Java API til XML-behandling (JAXP), som er et paraplybegrep, der dækker de fleste aspekter af XML-behandling. Disse inkluderer:

  • DOM: Dokumentobjektmodellen inkluderer klasser til at arbejde med XML-artefakter såsom element, node, attributter osv. DOM API indlæser det komplette XML-dokument i hukommelse til behandling, så det er ikke meget velegnet til at arbejde med store XML-filer.
  • SAX: Simple API til XML er en begivenhedsstyret algoritme til læsning af XML. Her behandles XML ved at skyde begivenheder, der findes, når du læser XML. Hukommelseskravene til brug af denne metode er lave, men at arbejde med API er mere kompliceret end at arbejde med DOM.
  • StAX-: Streaming API for XML er en nylig tilføjelse til XML API'er og giver højtydende strømfiltrering, behandling og modifikation af XML. Selvom det undgår at indlæse hele XML-dokumentet i hukommelsen, giver det en pull-type arkitektur snarere end en begivenhedsstyret arkitektur, så applikationen er lettere at kode og forstå end at bruge SAX API.

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

En prøve XML-fil

Med henblik på denne artikel demonstrerer vi koncepterne ved hjælp af følgende prøve XML, som kan findes her:

   Gambardella, Matthew XML Udviklervejledning Computer 44.95 2000-10-01 Et dybtgående blik på at oprette 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 trin er at få et eksempel på DocumentBuilder. Builder bruges til at analysere 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 til at læse Dokumentdokument = builder.parse (fil); Elementkatalog = document.getDocumentElement (); 

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

Brug af DOM API

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

Få alle Bestil børn af rodelementet og loop over dem. Noter det getChildNodes () vender tilbage alle børn, inklusive tekst, kommentarer osv. Til vores formål har vi brug for bare børnelementerne, så vi springer over de andre.

NodeList-bøger = katalog.getChildNodes (); for (int i = 0, ii = 0, n = books.getLength (); i < n ; i++)  Node child = books.item(i); if ( child.getNodeType() != Node.ELEMENT_NODE ) continue; Element book = (Element)child; // work with the book Element here  

Hvordan finder du et specifikt barnelement i betragtning af forælderen? Den følgende statiske metode returnerer det første matchende element, hvis det findes eller er null. Som du kan se, involverer proceduren at få listen over underordnede knuder og sløjfe gennem dem udvælge elementknudepunkter med det specificerede navn.

statisk privat knudepunkt findFirstNamedElement (nodeforælder, streng-tagnavn) NodeList-børn = forælder.getChildNodes (); for (int i = 0, i = børn.getLength (); i < in ; i++)  Node child = children.item(i); if ( child.getNodeType() != Node.ELEMENT_NODE ) continue; if ( child.getNodeName().equals(tagName) ) return child;  return null;  

Bemærk, at DOM API behandler tekstindhold i et element som en separat nodetype TEXT_NODE. Derudover kan tekstindholdet opdeles i flere tilstødende tekstknudepunkter. Derfor kræves følgende specielle behandling for at hente tekstindholdet i et element.

statisk privat streng getCharacterData (nodeforælder) StringBuilder text = new StringBuilder (); hvis (forælder == null) returnerer tekst.toString (); NodeList-børn = forælder.getChildNodes (); for (int k = 0, kn = børn.getLength (); k < kn ; k++)  Node child = children.item(k); if ( child.getNodeType() != Node.TEXT_NODE ) break; text.append(child.getNodeValue());  return text.toString();  

Bevæbnet med disse bekvemmelighedsfunktioner, lad os nu se på nogle kode til liste over nogle oplysninger fra vores eksempel XML. Vi vil gerne vise detaljerede oplysninger for hver bog, som f.eks. Ville være tilgængelig i et bogkatalog.

NodeList-bøger = katalog.getChildNodes (); for (int i = 0, ii = 0, n = books.getLength (); i < n ; i++)  Node child = books.item(i); if ( child.getNodeType() != Node.ELEMENT_NODE ) continue; Element book = (Element)child; ii++; String id = book.getAttribute("id"); String author = getCharacterData(findFirstNamedElement(child,"author")); String title = getCharacterData(findFirstNamedElement(child,"title")); String genre = getCharacterData(findFirstNamedElement(child,"genre")); String price = getCharacterData(findFirstNamedElement(child,"price")); String pubdate = getCharacterData(findFirstNamedElement(child,"pubdate")); String descr = getCharacterData(findFirstNamedElement(child,"description")); System.out.printf("%3d. book id = %s\n" + " author: %s\n" + " title: %s\n" + " genre: %s\n" + " price: %s\n" + " pubdate: %s\n" + " descr: %s\n", ii, id, author, title, genre, price, pubdate, descr);  

Skrivning af XML-output

Java leverer XML Tranform API til at transformere XML-data. Vi bruger denne API sammen med identitet transform at generere output.

Lad os som et eksempel tilføje en ny Bestil element til prøvekataloget præsenteret ovenfor. Detaljerne i bogen (som f.eks forfatter, titel, osv.) kan fås eksternt, måske fra en egenskapsfil eller en database. Vi bruger følgende egenskabsfil til at indlæse dataene.

id = bk113 forfatter = Jane Austen titel = Stolthed og fordomme genre = Romantik pris = 6.99 publish_date = 2010-04-01 beskrivelse = "Det er en sandhed, der universelt er anerkendt, at en enkelt mand, der er i besiddelse af en formue, skal have mangel på en kone. " Så begynder Pride and Prejudice, Jane Austens vittige komedie med manerer - en af ​​de mest populære romaner i alle tider - der indeholder pragtfuldt civiliseret sparring mellem den stolte Mr. Darcy og den fordomsfulde Elizabeth Bennet, når de spiller deres livlige fængsel i en serie af det attende århundrede tegnerum intriger. 

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

Fil fil = ...; // XML-fil til 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 ganske enkel og vist nedenfor.

String propsFile = ...; Egenskaber rekvisitter = nye egenskaber (); prøv (FileReader i = ny 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 ("forfatter"); String title = props.getProperty ("title"); Stringgenre = props.getProperty ("genre"); String price = 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øje barnets elementer til Bestil er trivielt. For nemheds skyld indsamler vi de krævede elementnavne i en Liste og tilføj værdierne i en løkke.

Liste elnames = Arrays.asList ("forfatter", "titel", "genre", "pris", "publish_date", "beskrivelse"); for (String elname: elnames) Element el = document.createElement (elname); Teksttekst = document.createTextNode (props.getProperty (elname)); el.appendChild (tekst); book.appendChild (el);  katalog.appendChild (bog); 

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

Til skrivning af XML har vi brug for et eksempel på Transformer som oprettes 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.INDENT, "ja"); tform.setOutputProperty ("http://xml.apache.org/xsltindent-amount", "3"); 

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

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

Brug følgende for at skrive output direkte til en fil.

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

Og det indpakker denne artikel om læsning og skrivning af 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 herunder.




Endnu ingen kommentarer

Om moderne teknologi, enkel og overkommelig.
Din guide i en verden af moderne teknologi. Lær hvordan du bruger de teknologier og gadgets, der omgiver os hver dag, og lær, hvordan du finder interessante ting på Internettet.