Annons

Vill du lära dig hur man läser och skriver en XML-fil från java?

XML-filer Vad är en XML-fil och hur kan du öppna och använda den?Du kanske har sett termen "XML." Du kan till och med ha öppnat en XML-fil av misstag. Vad är XML och hur använder du det? Läs mer används för en mängd olika ändamål, inklusive lagring av data. Innan JSON blev populärt var XML det föredragna formatet för att representera, lagra och transportera strukturerad data. Även om populariteten för XML har avtagit under 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 grundläggande Java-koncept du bör lära dig när du kommer igångOavsett om du skriver ett GUI, utvecklar programvara på serversidan eller en mobilapplikation som använder Android, kommer att lära dig Java tjäna dig väl. Här är några grundläggande Java-koncept som hjälper dig att komma igång. Läs mer inkluderar Java API för XML-bearbetning (JAXP), som är en paraplyterm som täcker de flesta aspekter av XML-bearbetning. Dessa inkluderar:

instagram viewer
  • DOM: Dokumentobjektmodellen innehåller klasser för att arbeta med XML-artefakter som element, nod, attribut, etc. DOM API laddar hela XML-dokumentet i minnet för bearbetning, så det är inte särskilt lämpat för att arbeta med stora XML-filer.
  • SAX: Simple API för XML är en händelsestyrd algoritm för att läsa XML. Här bearbetas XML genom att utlösa händelser som hittas vid läsning av XML. Minneskraven för att använda den här metoden är låga, men att arbeta med API: t är mer komplext än att arbeta med DOM.
  • StAX: Streaming API för XML är ett nyligen tillägg till XML API: er och tillhandahåller högpresterande strömfiltrering, bearbetning och modifiering av XML. Även om det undviker att ladda hela XML-dokumentet i minnet, ger det snarare en pull-typ-arkitektur än en händelsestyrd arkitektur, så applikationen är lättare att koda och förstå än att använda SAX API.

I den här artikeln använder vi DOM API för 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å en XML-fil

För syftet med den här artikeln visar vi begreppen med hjälp av följande exempel på XML, som kan hittas här:

 1.0?>Gambardella, MatthewXML-utvecklarguide
Dator44.952000-10-01En fördjupad 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 instans 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 factory = DocumentBuilderFactory.newInstance(); factory.setNamespaceAware (falskt); factory.setValidating (false); DocumentBuilder builder = factory.newDocumentBuilder(); 

Vi kan nu ladda hela dokumentet i minnet med start från XML-rotelementet. I vårt exempel är det katalog element.

Fil fil =...; // XML-fil att läsa. Dokumentdokument = builder.parse (fil); Elementkatalog = document.getDocumentElement(); 

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

Använder DOM API

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

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

NodeList books = catalog.getChildNodes(); for (int i = 0, ii = 0, n = books.getLength(); i < n; i++) { Nodbarn = books.item (i); if ( child.getNodeType() != Nod. ELEMENT_NODE ) fortsätt; Elementbok = (Element) barn; // arbeta med boken Element här. }

Hur hittar man ett specifikt underordnat element, givet föräldern? Följande statiska metod returnerar det första matchande elementet om det hittas, eller null. Som du kan se innebär proceduren att hämta listan över underordnade noder och gå igenom dem och välja ut elementnoder med det angivna namnet.

statisk privat Node findFirstNamedElement (Nodförälder, String tagName) { NodeList children = parent.getChildNodes(); for (int i = 0, in = children.getLength(); i < in; i++) { Nodbarn = barn.objekt (i); if ( child.getNodeType() != Nod. ELEMENT_NODE ) fortsätt; if ( child.getNodeName().equals (tagName) ) returnerar barn; } returnera null; }

Observera att DOM API behandlar textinnehåll i ett element som en separat nod av typ TEXT_NODE. Dessutom kan textinnehållet delas upp i flera intilliggande textnoder. Så följande speciella bearbetning krävs för att hämta textinnehållet i ett element.

statisk privat sträng getCharacterData (nodförälder) { StringBuilder text = new StringBuilder(); if (förälder == null) returnera text.toString(); NodeList children = parent.getChildNodes(); for (int k = 0, kn = children.getLength(); k < kn; k++) { Nodbarn = barn.objekt (k); if ( child.getNodeType() != Nod. TEXT_NODE ) break; text.append (child.getNodeValue()); } returnera text.toString(); }

Beväpnad med dessa bekvämlighetsfunktioner, låt oss nu titta på lite kod för att lista ut lite information från vårt exempel på XML. Vi skulle vilja visa detaljerad information för varje bok, som skulle finnas tillgänglig i en bokkatalog.

NodeList books = catalog.getChildNodes(); for (int i = 0, ii = 0, n = books.getLength(); i < n; i++) { Nodbarn = books.item (i); if ( child.getNodeType() != Nod. ELEMENT_NODE ) fortsätt; Elementbok = (Element) barn; ii++; String id = book.getAttribute("id"); Strängförfattare = getCharacterData (findFirstNamedElement (barn,"författare")); String title = getCharacterData (findFirstNamedElement (child,"title")); Stringgenre = getCharacterData (findFirstNamedElement (barn,"genre")); String price = getCharacterData (findFirstNamedElement (child,"price")); String pubdate = getCharacterData (findFirstNamedElement (child,"pubdate")); String descr = getCharacterData (findFirstNamedElement (child,"description")); System.out.printf("%3d. bok-id = %s\n" + " författare: %s\n" + " titel: %s\n" + " genre: %s\n" + " pris: %s\n" + " utgivningsdatum: %s \n" + " descr: %s\n", ii, id, author, title, genre, price, publicdate, descr); }

Skriver XML-utdata

Java tillhandahåller XML Transform API för att omvandla XML-data. Vi använder detta API med identitetsförvandling att generera output.

Som ett exempel, låt oss lägga till en ny bok element till exempelkatalogen som presenteras ovan. Detaljerna i boken (t.ex författare, titel, etc) kan erhållas externt, kanske från en egenskapsfil eller en databas. Vi använder följande egenskapsfil för att ladda data.

id=bk113. författare=Jane Austen. title=Stolthet och fördom. genre=Romantik. pris=6,99. publiceringsdatum=2010-04-01. description="Det är en allmänt erkänd sanning att en ensamstående man som har en god förmögenhet måste sakna en hustru." Så börjar Pride och Prejudice, Jane Austens kvicka uppförandekomedi - en av de mest populära romanerna genom tiderna - som har en fantastisk civiliserad sparring mellan den stolte Mr. Darcy och den fördomsfulla Elizabeth Bennet när de spelar ut sitt livliga uppvaktning i en serie 1700-talssalonger ränker. 

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

Fil fil =...; // XML-fil att läsa. Dokumentdokument = builder.parse (fil); Elementkatalog = document.getDocumentElement(); 

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

String propsFile =...; Properties props = new Properties(); try (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"); Strängförfattare = props.getProperty("författare"); String title = props.getProperty("titel"); Stringgenre = props.getProperty("genre"); Strängpris = props.getProperty("pris"); String publish_date = props.getProperty("publish_date"); String descr = props.getProperty("beskrivning"); 

Låt oss nu skapa en tom bok element.

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

Lägga till de underordnade elementen till 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 loop.

Listaelnames =Arrays.asList("författare", "titel", "genre", "pris", "publiceringsdatum", "beskrivning"); for (String elname: elnames) { Element el = document.createElement (elname); Text text = document.createTextNode (props.getProperty (elname)); el.appendChild (text); book.appendChild (el); } catalog.appendChild (bok);

Och det är så det görs. De katalog element har nu den nya bok element lagts till. Allt som återstår nu är att skriva ut den uppdaterade XML-filen.

För att skriva XML behöver vi en instans av Transformator som skapas enligt nedan. Observera att vi begär indrag av utdata-XML med hjälp av setOutputProperty() metod.

TransformerFactory tfact = TransformerFactory.newInstance(); Transformer tform = tfact.newTransformer(); tform.setOutputProperty (OutputKeys. INDRAG, "ja"); tform.setOutputProperty("{ http://xml.apache.org/xslt}indent-amount", "3"); 

Det sista steget i att generera XML-utdata är att tillämpa transformationen. Resultatet visas på utgångsströmmen, System.ut.

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

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

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

Och det avslutar 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.