Java Properties dalam XML

Properti Java telah menjadi pokok pengembangan Java selama bertahun-tahun. Sehingga hari ini, sifat Java digunakan dalam kerangka kerja dan alat yang popular seperti Spring Framework dan Ant. Sebilangan besar sifat Java yang saya lihat sering digunakan mengikuti paradigma name = value yang dicuba dan benar. Namun, sejak J2SE 5, mudah memuatkan (dan menyimpan) sifat dalam format XML.

Dalam pengalaman saya, fail sifat khas kelihatan seperti yang ditunjukkan seterusnya.

contoh.properties

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

J2SE 5 mempermudah memuatkan sifat dari XML (dan menyimpan harta ke XML). Dokumentasi API berasaskan Javadoc untuk kelas Properties membincangkan kedua-dua format. Dokumentasi ini menunjukkan DTD yang digunakan untuk menentukan tatabahasa Properties XML:

DTD menunjukkan kepada kita bahawa sifat yang disimpan dalam XML mesti ada sebagai elemen akar yang diperlukan dari XML yang terbentuk dengan baik dan boleh mempunyai sifar atau satu elemen yang bersarang dalam tag akar ini. Kami juga belajar dari DTD ini bahawa nama elemen sifar hingga banyak dibenarkan dan entryelemen tersebut mungkin mengandungi badan data dan satu atribut yang dinamakan key. Berdasarkan DTD ini, kami dapat menulis fail sifat berasaskan XML yang serasi dengan tangan, tetapi cara yang lebih mudah untuk melihatnya adalah dengan membaca dalam fail sifat tradisional pasangan nama / nilai dan menyimpannya kembali dalam format XML. Inilah yang dilakukan oleh kelas Java seterusnya, PropertiesExamples .

PropertiesContoh.java

package dustin.properties; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStream; import java.util.Properties; public class PropertiesExamples { /** No-arguments constructor. */ public PropertiesExamples() {} /** * Get traditional properties in name=value format. * * @param filePathAndName Path and name of properties file (without the * .properties extension). * @return Properties read in from provided file. */ public Properties loadTraditionalProperties( final String filePathAndName) { final Properties properties = new Properties(); try { final FileInputStream in = new FileInputStream(filePathAndName); properties.load(in); in.close(); } catch (FileNotFoundException fnfEx) { System.err.println("Could not read properties from file " + filePathAndName); } catch (IOException ioEx) { System.err.println( "IOException encountered while reading from " + filePathAndName); } return properties; } /** * Store provided properties in XML format. * * @param sourceProperties Properties to be stored in XML format. * @param out OutputStream to which to write XML formatted properties. */ public void storeXmlProperties( final Properties sourceProperties, final OutputStream out) { try { sourceProperties.storeToXML(out, "This is easy!"); } catch (IOException ioEx) { System.err.println("ERROR trying to store properties in XML!"); } } /** * Store provided properties in XML format to provided file. * * @param sourceProperties Properties to be stored in XML format. * @param pathAndFileName Path and name of file to which XML-formatted * properties will be written. */ public void storeXmlPropertiesToFile( final Properties sourceProperties, final String pathAndFileName) { try { FileOutputStream fos = new FileOutputStream(pathAndFileName); storeXmlProperties(sourceProperties, fos); fos.close(); } catch (FileNotFoundException fnfEx) { System.err.println("ERROR writing to " + pathAndFileName); } catch (IOException ioEx) { System.err.println( "ERROR trying to write XML properties to file " + pathAndFileName); } } /** * Runs main examples. * * @param arguments Command-line arguments; none anticipated. */ public static void main(final String[] arguments) { final PropertiesExamples me = new PropertiesExamples(); final Properties inputProperties = me.loadTraditionalProperties("examples.properties"); me.storeXmlPropertiesToFile(inputProperties, "examples-xml.properties"); } } 

Kelas yang ditunjukkan di atas dibaca dalam fail sifat yang disenaraikan sebelumnya dan kemudian menulisnya semula dalam format XML. Garis kod sebenarnya yang melakukan sebahagian besar pekerjaan adalah jumlahnya kecil, tetapi banyak pengecualian yang diperiksa yang berkaitan dengan input / output fail menjadikan pangkalan kod jauh lebih besar.

Apabila kod ini dijalankan, output berikut dihasilkan:

contoh-xml.properties

  This is easy! //www.softwaresummit.com/ //www.rmoug.org/ //marxsoftware.blogspot.com/ //www.javaworld.com/ //www.oracle.com/technology/index.html  

Fail XML yang dihasilkan ini mengandungi pasangan nama / nilai yang sama dengan fail sifat tradisional yang ditunjukkan sebelumnya, dapat dibaca seperti versi tradisional menggunakan Properties.loadFromXML, dan termasuk komen yang diteruskan ke kaedah Properties.storeToXML.

Kesimpulannya

Adalah cukup mudah untuk memuatkan sifat dari XML dan menyimpannya sebagai XML. Walau bagaimanapun, XML pada dasarnya terhad kepada paradigma pasangan nama / nilai yang sama dengan fail sifat tradisional. Oleh itu, kami tidak dapat memanfaatkan sifat hierarki XML untuk menggunakan hubungan yang lebih kompleks daripada satu kunci (nama) untuk satu nilai. Sebab utama seseorang menggunakan sokongan Java untuk sifat berdasarkan XML adalah jika XML digunakan untuk alat atau kerangka kerja lain dan sifat dalam XML lebih mudah diakses oleh alat atau kerangka lain.

Kisah ini, "Java Properties in XML" pada awalnya diterbitkan oleh JavaWorld.