Så här läser och skriver du XML-filer med kod

Så här läser och skriver du XML-filer med kod / Programmering

Vill du lära dig att läsa och skriva en XML-fil från java?

XML-filer används för olika ändamål, inklusive lagring av data. Innan JSON blev populär var XML det föredragna formatet för att representera, lagra och transportera strukturerad data. Trots att XML-populariteten har minskat de senaste åren kan du stöta på det ibland, så det är viktigt att lära sig hur man arbetar med det från kod.

Java Standard Edition (SE) 10 Core Java Concepts Du bör lära dig när du kommer igång 10 Core Java Concepts Du bör lära dig när du kommer igång Oavsett om du skriver en GUI, utvecklar serverns program eller en mobil applikation med Android, lär Java att tjäna du bra Här är några grundläggande Java-koncept för att hjälpa dig att komma igång. Läs mer innehåller Java API för XML-bearbetning (JAXP), vilket är ett paraplybegrepp som täcker de flesta aspekterna av XML-bearbetning. Dessa inkluderar:

  • DOM: Dokumentobjektmodellen innehåller klasser för att arbeta med XML-artefakter som element, nod, attribut etc. DOM API fyller hela XML-dokumentet till minne för bearbetning, så det är inte särskilt lämpat för att arbeta med stora XML-filer.
  • SAX: Den enkla API för XML är en händelsesdriven algoritm för att läsa XML. Här bearbetas XML genom att skjuta händelser som hittades vid läsning av XML. Minneskraven för att använda den här metoden är låg, men arbetet med API: n är mer komplext än att arbeta med DOM.
  • STAX: Streaming API för XML är ett nytt tillägg till XML APIs och ger högpresterande strömfiltrering, bearbetning och modifiering av XML. Medan det undviker att hela XML-dokumentet laddas i minnet, ger det en arkitektur av typen drastisk snarare än en händelsesdriven arkitektur, så programmet är lättare att koda och förstå än att använda SAX API.

I den här artikeln använder vi DOM API att visa hur man läser och skriver XML-filer från Java. Vi kommer att täcka de andra två API: erna i framtida artiklar.

Ett exempel på XML-fil

I den här artikeln visar vi koncepten med hjälp av följande XML-exempel, som finns här:

   Gambardella, Matthew XML-utvecklarhandboken Dator 44,95 2000/10/01 En djupgående titt på att skapa applikationer med XML.   Ralls, Kim... 

Läser en XML-fil

Låt oss titta på de grundläggande stegen som krävs för att läsa en XML-fil med DOM API.

Det första steget är att få en förekomst av DocumentBuilder. Byggaren används för att analysera XML-dokument. För grundläggande användning gör vi det så här:

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

Vi kan nu ladda hela dokumentet till minnet från och med XML-root-elementet. I vårt exempel är det katalog element.

Filfil = ...; // XML-fil för att läsa Dokumentdokument = builder.parse (fil); Element catalog = document.getDocumentElement (); 

Och det är det, folk! DOM API för att läsa en XML är väldigt enkelt. Du har nu tillgång till hela XML-dokumentet från dess rotelement, katalog. Låt oss nu se hur vi ska arbeta med det.

Använda DOM API

Nu när vi har XML-roten Element, Vi kan använda DOM API för att extrahera intressanta nuggets med information.

Få alla bok barn av rotelementet och slinga över dem. Anteckna det getChildNodes () avkastning Allt barn, inklusive text, kommentarer etc. För vårt ändamål behöver vi bara barnelementen, så vi hoppar över de andra.

NodeList böcker = catalog.getChildNodes (); för (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  

Hur hittar du ett specifikt barnelement, med föräldern? Följande statiska metod returnerar det första matchande elementet om det hittades, eller null. Som du kan se handlar proceduren om att få listan över barnnoder och looping genom dem att plocka ut elementnoder med det angivna namnet.

statisk privat Node findFirstNamedElement (Node parent, String tagName) NodeList children = parent.getChildNodes (); för (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;  

Observera att DOM API behandlar textinnehåll inom ett element som en separat nod av typen TEXT_NODE. Dessutom kan textinnehållet delas upp i flera angränsande textnoder. Så följande specialbehandling krävs för att hämta textinnehållet inom ett element.

statisk privat String getCharacterData (Noder förälder) StringBuilder text = new StringBuilder (); om (förälder == null) returnera text.toString (); NodeList children = parent.getChildNodes (); för (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äpnad med dessa bekvämlighetsfunktioner, låt oss nu titta på någon kod för att lista ut några uppgifter från vårt XML-prov. Vi skulle vilja visa detaljerad information för varje bok, som skulle vara tillgänglig i en bokkatalog.

NodeList böcker = catalog.getChildNodes (); för (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);  

Skriva XML-utgång

Java tillhandahåller XML Tranform API att transformera XML-data. Vi använder detta API med identitetstransformation att generera produktionen.

Låt oss till exempel lägga till en ny bok element till provkatalogen presenterad ovan. Bokens detaljer (t.ex. författare, titel, etc) kan erhållas externt, kanske från en egenskapsfil eller en databas. Vi använder följande egenskaper fil för att ladda data.

id = bk113 författare = Jane Austen title = Pride and Prejudice genre = Romantik pris = 6.99 publish_date = 2010-04-01 description = "Det är en sanning som är universellt erkänd att en enda man som är i besittning av en lycka måste vara i behov av en fru." Så börjar Pride and Prejudice, Jane Austens skämsliga komedie av manners-en av de mest populära romanen av alla tider. Det har enastående civiliserad sparring mellan den stolta herrn Darcy och den fördomade Elizabeth Bennet som de spelar ut sina livliga frieri i en serie av artonhundratals talrumsintriger. 

Det första steget är att analysera den befintliga XML-filen med den metod som presenteras ovan. Koden visas också nedan.

Filfil = ...; // XML-fil för att läsa Dokumentdokument = builder.parse (fil); Element catalog = document.getDocumentElement (); 

Vi laddar data från egenskapsfilen med hjälp av Egenskaper klass med java. Koden är ganska enkel och visas nedan.

String propsFile = ...; Egenskaper rekvisita = nya egenskaper (); försök (FileReader in = new FileReader (propsFile)) props.load (in);  

När egenskaperna är laddade hämtar vi de värden vi vill lägga till från egenskapsfilen.

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

Låt oss nu skapa en tom bok element.

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

Lägga till barnelementen i bok är trivialt. För enkelhetens skull samlar vi in ​​de nödvändiga elementnamnen i en Lista och lägg till värdena i en slinga.

Lista elnames = Arrays.asList ("författare", "titel", "genre", "pris", "publish_date", "description"); för (String elname: elnames) Element el = document.createElement (elname); Texttext = document.createTextNode (props.getProperty (elname)); el.appendChild (text); book.appendChild (el);  catalog.appendChild (bok); 

Och så är det gjort. De katalog Elementet har nu det nya bok element tillagt Allt som återstår nu är att skriva ut den uppdaterade XML-filen.

För att skriva XML måste vi ha en instans av Transformator som skapas som visas nedan. Observera att vi begär inmatning av XML-utgången med hjälp av setOutputProperty () metod.

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

Det sista steget i att generera XML-utgången är att tillämpa tranformationen. Resultatet visas på utmatningsströmmen, System.out.

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

För att skriva utmatningen direkt till en fil, använd följande.

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

Och det bryter upp den här artikeln om att läsa och skriva XML-filer med DOM API.

Har du använt DOM API i dina applikationer? Hur fungerade det? Vänligen meddela oss i kommentarerna nedan.

Utforska mer om: Java.