Slik leser og skriver XML-filer med kode

Slik leser og skriver XML-filer med kode / programmering

Vil du lære å lese og skrive en XML-fil fra java?

XML-filer brukes til en rekke formål, inkludert lagring av data. Før JSON ble populært, var XML det foretrukne formatet for å representere, lagre og transportere strukturerte data. Selv om XML-populariteten har gått ned de siste årene, kan du støte på det noen ganger, så det er viktig å lære å jobbe med det fra kode.

Java Standard Edition (SE) 10 Core Java Concepts Du bør lære når du kommer i gang 10 Core Java Concepts Du bør lære når du kommer i gang Uansett om du skriver en GUI, utvikler server-side programvare, eller et mobilprogram ved hjelp av Android, vil læring Java tjene du bra. Her er noen kjerne-Java-konsepter for å hjelpe deg med å komme i gang. Les mer inkluderer Java API for XML-behandling (JAXP), som er en paraply term som dekker de fleste aspekter av XML-behandling. Disse inkluderer:

  • DOM: Dokumentobjektmodellen inneholder klasser for å jobbe med XML-artefakter som element, knutepunkt, attributter, etc. DOM API laster det komplette XML-dokumentet til minne for behandling, slik at det ikke er spesielt egnet for bruk med store XML-filer.
  • SAX: Den enkle API for XML er en hendelse-drevet algoritme for å lese XML. Her behandles XML ved å skyte hendelser som er funnet når du leser XML. Minnekravene for bruk av denne metoden er lave, men det er mer komplisert å arbeide med APIen enn å jobbe med DOM.
  • Stax: Streaming API for XML er et nylig tillegg til XML APIs og gir høy ytelse strøm filtrering, behandling og modifisering av XML. Selv om det unngås å laste hele XML-dokumentet i minnet, gir det en pull-type arkitektur i stedet for en hendelse-drevet arkitektur, slik at applikasjonen er enklere å kode og forstå enn å bruke SAX API.

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

En Eksempel på XML-fil

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

   Gambardella, Matthew XML Developer's Guide Datamaskin 44.95 2000-10-01 En grundig titt på å lage programmer med XML.   Ralls, Kim... 

Leser 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 fabrikk = DocumentBuilderFactory.newInstance (); factory.setNamespaceAware (false); factory.setValidating (false); DocumentBuilder builder = factory.newDocumentBuilder (); 

Vi kan nå laste hele dokumentet til minne som starter fra XML-root-elementet. I vårt eksempel er det katalog element.

Filfil = ...; // XML-fil for å lese Document document = builder.parse (fil); Element catalog = document.getDocumentElement (); 

Og det er det, folkens! DOM API for å lese et XML er veldig enkelt. Du har nå tilgang til hele XML-dokumentet med utgangspunkt i rotelementet, katalog. La oss nå se hvordan vi skal jobbe med det.

Bruk av DOM API

Nå som vi har XML-rotasjonen Element, Vi kan bruke DOM API til å trekke ut interessante nuggets med informasjon.

Få alle bok barn av rotelementet og sløyfe over dem. Noter det getChildNodes () avkastning alle barn, inkludert tekst, kommentarer, etc. For vårt formål trenger vi bare barnets elementer, så vi hopper over de andre.

NodeList bøker = catalog.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 finner du et bestemt barnelement, gitt foreldrene? Følgende statiske metode returnerer det første matchende elementet hvis det finnes, eller null. Som du kan se, innebærer prosedyren å få listen over barnnoder og looping gjennom dem å plukke ut elementnoder med det angitte navnet.

statisk privat Node findFirstNamedElement (Node parent, String tagName) NodeList children = parent.getChildNodes (); for (int i = 0, in = children.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;  

Vær oppmerksom på at DOM API behandler tekstinnhold i et element som en separat type node TEXT_NODE. I tillegg kan tekstinnholdet deles inn i flere tilstøtende tekstnoder. Så følgende spesielle behandling er nødvendig for å hente tekstinnholdet i et element.

statisk privat String getCharacterData (Node foreldre) StringBuilder text = new StringBuilder (); hvis (foreldre == null) returnere text.toString (); NodeList barn = parent.getChildNodes (); for (int k = 0, kn = children.getLength (); k < kn ; k++)  Node child = children.item(k); if ( child.getNodeType() != Node.TEXT_NODE ) break; text.append(child.getNodeValue());  return text.toString();  

Bevæpnet med disse bekvemmelighetsfunksjonene, la oss nå se på noen kode for å oppgi noen informasjon fra vår XML-prøve. Vi vil gjerne vise detaljert informasjon for hver bok, som for eksempel være tilgjengelig i en bokkatalog.

NodeList bøker = catalog.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);  

Skrive XML-utgang

Java gir XML Tranform API å transformere XML-data. Vi bruker denne API med identitetstransformasjon å generere produksjon.

For eksempel, la oss legge til en ny bok element til utvalgskatalogen som presenteres ovenfor. Detaljer om boken (for eksempel forfatter, tittel, etc) kan fås eksternt, kanskje fra en egenskapsfil eller en database. Vi bruker følgende egenskaper fil for å laste dataene.

id = bk113 forfatter = Jane Austen title = Pride and Prejudice genre = Romance pris = 6.99 publish_date = 2010-04-01 description = "Det er en sannhet som er universelt anerkjent at en eneste mann som er i besittelse av en formue, må være i lyst en kone." Så begynner Pride and Prejudice, Jane Austen sin vittige komedie av manerer - en av de mest populære romaner av all tid - som har en fantastisk sivilisert sparring mellom den stolte mr. Darcy og den fordømte Elizabeth Bennet som de utspiller sin spirituelle frieri i en serie av åttende århundre tegning rom intriger. 

Det første trinnet er å analysere den eksisterende XML-filen ved hjelp av metoden som presenteres ovenfor. Koden er også vist nedenfor.

Filfil = ...; // XML-fil for å lese Document document = builder.parse (fil); Element catalog = document.getDocumentElement (); 

Vi laster dataene fra egenskapsfilen ved hjelp av Eiendommer Klassen er utstyrt med java. Koden er ganske enkel og vist nedenfor.

String propsFile = ...; Egenskaper rekvisitter = nye egenskaper (); prøv (FileReader in = new FileReader (propsFile)) props.load (in);  

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

String id = props.getProperty ("id"); String author = props.getProperty ("author"); String title = props.getProperty ("title"); Stringsgenre = props.getProperty ("genre"); String price = props.getProperty ("price"); String publish_date = props.getProperty ("publish_date"); String descr = props.getProperty ("beskrivelse"); 

La oss nå lage en tom bok element.

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

Legge til barnelementene i bok er trivielt. For enkelhets skyld samler vi inn de nødvendige elementene i en Liste og legg til verdiene i en loop.

Liste elnames = Arrays.asList ("author", "title", "genre", "pris", "publish_date", "description"); for (String elnavn: elnames) Element el = document.createElement (elname); Teksttekst = document.createTextNode (props.getProperty (elname)); el.appendChild (tekst); book.appendChild (el);  catalog.appendChild (bok); 

Og så er det gjort. De katalog elementet har nå den nye bok element lagt til Alt som gjenstår nå er å skrive ut oppdatert XML.

For å skrive XML, trenger vi en forekomst av transformator som er opprettet som vist nedenfor. Legg merke til at vi ber om innrykk av utdata XML ved hjelp av setOutputProperty () metode.

TransformerFactory tfact = TransformerFactory.newInstance (); Transformer tform = tfact.newTransformer (); tform.setOutputProperty (OutputKeys.INDENT, "yes"); tform.setOutputProperty ("http://xml.apache.org/xsltindent-amount", "3"); 

Det siste trinnet i generering av XML-utdata er å anvende tranformasjonen. Resultatet vises på utgangsstrømmen, System.out.

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

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

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

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

Har du brukt DOM API i dine applikasjoner? Hvordan gjorde det? Vennligst gi oss beskjed i kommentarene nedenfor.

Utforsk mer om: Java.