Programmering

Java-egenskaber i XML

Java-egenskaber har været en grundlæggende faktor i Java-udvikling i mange år. Selv i dag bruges Java-egenskaber i populære rammer og værktøjer som Spring Framework og Ant. De fleste af de Java-egenskaber, som jeg har set brugt ofte, følger det prøvede og sande navn = værdi-paradigme. Siden J2SE 5 har det imidlertid været let at indlæse (og gemme) egenskaber i XML-format.

Efter min erfaring er typisk egenskabsfilen ser ud som det, der vises næste.

eksempler. ejendomme

url.blog.dustin = // marxsoftware.blogspot.com/ url.javaworld = // www.javaworld.com/ url.coloradosoftwaresummit = // www.softwaresummit.com/ url.otn = // www.oracle.com/ teknologi / index.html url.rmoug = // www.rmoug.org/ 

J2SE 5 gjorde det let at indlæse egenskaber fra XML (og gemme egenskaber til XML). Den Javadoc-baserede API-dokumentation til egenskabsklassen diskuterer begge formater. Denne dokumentation viser den DTD, der bruges til at definere XML-grammatikken for egenskaber:

DTD viser os, at egenskaber, der er gemt i XML, skal have som rodelement, der kræves af velformet XML og kan have nul eller en elementer indlejret i dette rodtag. Vi lærer også af denne DTD, at nul til mange elementer navngiver er tilladt, og at en indgang elementet kan indeholde et dataelement og en navngivet enkelt attribut nøgle. Baseret på denne DTD kunne vi skrive en kompatibel XML-baseret egenskabsfil manuelt, men en endnu nemmere måde at se en er at læse i en traditionel egenskabsfil med navn / værdipar og gemme den tilbage i XML-format. Dette er præcis, hvad den næste Java-klasse, EgenskaberEksempler, gør.

PropertiesExamples.java

pakke støv. ejendomme; importere java.io.FileInputStream; import java.io.FileNotFoundException; importere java.io.FileOutputStream; importere java.io.IOException; importere java.io.OutputStream; importere java.util.Properties; public class PropertiesExamples {/ ** Ingen konstruktør-konstruktør. * / public PropertiesExamples () {} / ** * Få traditionelle egenskaber i formatet navn = værdi. * * @param filePathAndName Sti og navn på egenskabsfilen (uden udvidelsen * .properties). * @return Properties indlæst fra den medfølgende fil. * / public Properties loadTraditionalProperties (final String filePathAndName) {final Properties egenskaber = nye egenskaber (); prøv {final FileInputStream i = ny FileInputStream (filePathAndName); egenskaber. belastning (i); i. luk (); } fange (FileNotFoundException fnfEx) {System.err.println ("Kunne ikke læse egenskaber fra fil" + filePathAndName); } fange (IOException ioEx) {System.err.println ("IOException stødte på under læsning fra" + filePathAndName); } returnere egenskaber; } / ** * Gem de leverede egenskaber i XML-format. * * @param sourceProperties Egenskaber, der skal gemmes i XML-format. * @param ud OutputStream, som du skal skrive XML-formaterede egenskaber til. * / public void storeXmlProperties (final Properties sourceProperties, final OutputStream out) {prøv {sourceProperties.storeToXML (ud, "Dette er let!"); } fange (IOException ioEx) {System.err.println ("FEJL forsøger at gemme egenskaber i XML!"); }} / ** * Gem angivne egenskaber i XML-format til den angivne fil. * * @param sourceProperties Egenskaber, der skal gemmes i XML-format. * @param pathAndFileName Sti og navn på den fil, som XML-formaterede * egenskaber skal skrives til. * / public void storeXmlPropertiesToFile (final Properties sourceProperties, final String pathAndFileName) {prøv {FileOutputStream fos = ny FileOutputStream (pathAndFileName); storeXmlProperties (sourceProperties, fos); fos.close (); } fange (FileNotFoundException fnfEx) {System.err.println ("FEJL skriver til" + pathAndFileName); } fange (IOException ioEx) {System.err.println ("FEJL forsøger at skrive XML-egenskaber til fil" + pathAndFileName); }} / ** * Kører hovedeksempler. * * @param argumenter Kommandolinjeargumenter; ingen forventede. * / public static void main (final String [] argumenter) {final PropertiesExamples me = new PropertiesExamples (); final Properties inputProperties = me.loadTraditionalProperties ("eksempler. ejendomme"); me.storeXmlPropertiesToFile (inputProperties, "eksempler-xml.properties"); }} 

Klassen vist ovenfor læser i egenskabsfilen, der er angivet tidligere, og skriver den derefter tilbage i XML-format. De faktiske kodelinjer, der udfører det meste af arbejdet, er små, men de mange kontrollerede undtagelser forbundet med filinput / -udgang gør kodebasen meget større.

Når denne kode køres, genereres følgende output:

eksempler-xml.egenskaber

  Dette er let! //www.softwaresummit.com/ //www.rmoug.org/ //marxsoftware.blogspot.com/ //www.javaworld.com/ //www.oracle.com/technology/index.html 

Denne genererede XML-fil indeholder samme navn / værdipar som den traditionelle egenskabsfil, der er vist tidligere, kan læses som den traditionelle version ved hjælp af Properties.loadFromXML og inkluderer den kommentar, der blev sendt til Properties.storeToXML-metoden.

Konklusion

Det er ret ligetil at indlæse egenskaber fra XML og at gemme dem som XML. XML er dog i det væsentlige begrænset til det samme paradigme for navn / værdipar som traditionelle egenskabsfiler. Derfor er vi ikke i stand til at drage fordel af XMLs hierarkiske karakter til at bruge forhold, der er mere komplekse end en nøgle (navn) til en værdi. Den primære årsag til, at man muligvis bruger Java's understøttelse af XML-baserede egenskaber, er, hvis XML blev brugt til andre værktøjer eller rammer, og egenskaberne i XML var mere tilgængelige for det andet værktøj eller ramme.

Denne historie, "Java Properties in XML" blev oprindeligt udgivet af JavaWorld.