Java'yı XML'e ve XML'yi Java'ya 5 dakikadan daha kısa sürede kodlamaya başlamak istiyorsanız, Basit XML Serileştirmeyi deneyin. JAXB API'sini öğrenmek için saatler harcamayın
http://simple.sourceforge.net/download/stream/doc/tutorial/tutorial.php
Bununla birlikte, JAXB öğrenmeye gerçekten meraklıysanız, işte mükemmel bir eğitim
http://blogs.oracle.com/teera/entry/jaxb_for_simple_java_xml
Öğreticinin içeriği:
Basit Java-XML serileştirme için JAXB
Java'da XML serileştirme yapmanın birkaç yolu vardır. Ayrıştırma ve serileştirme üzerinde ayrıntılı denetim istiyorsanız, daha iyi performans için SAX, DOM veya Stax'ı tercih edebilirsiniz. Yine de, sık sık yapmak istediğim şey, POJO'lar ve XML arasında basit bir eşleştirme. Ancak, manuel olarak XML olay ayrıştırması yapmak için Java sınıfları oluşturmak önemsiz değildir. Yakın zamanda JAXB'yi hızlı ve kullanışlı bir Java-XML eşlemesi veya serileştirme olarak buldum.
JAXB birçok kullanışlı özellik içerir, burada referans uygulamasına göz atabilirsiniz. Kohsuke'nin Blogu da JAXB hakkında daha fazla bilgi edinmek için iyi bir kaynaktır. Bu blog yazısı için, size JAXB ile basit bir Java-XML serileştirmenin nasıl yapılacağını göstereceğim.
POJO'dan XML'e
Diyelim ki bir Öğe Java nesnem var. Bir Öğe nesnesini XML biçiminde serileştirmek istiyorum. İlk yapmam gereken şey, bu POJO'ya javax.xml.bind.annotation. * Paketinden birkaç XML ek açıklaması eklemektir. Item.java için kod listesi 1'e bakın
Koddan
@XmlRootElement(name="Item")
kök öğe olmak istediğimi belirtir.
@XmlType(propOrder = {"name", "price"})
öğenin XML çıktısında düzenlenmesini istediğim sırayı gösterir.
@XmlAttribute(name="id", ...)
id'nin kök öğenin bir özniteliği olduğunu belirtir.
@XmlElement(....)
Fiyat ve adın Öğe içinde yer almasını istediğimi belirtir.
Benim Item.java
hazırım. Sonra devam edebilir ve Item'ı sıralamak için JAXB komut dosyası oluşturabilirim.
//creating Item data object
Item item = new Item();
item.setId(2);
item.setName("Foo");
item.setPrice(200);
.....
JAXBContext context = JAXBContext.newInstance(item.getClass());
Marshaller marshaller = context.createMarshaller();
//I want to save the output file to item.xml
marshaller.marshal(item, new FileWriter("item.xml"));
Kod Listesinin tamamı için lütfen Kod Listeleme 2'ye bakın main.java
. Çıktı Kodu Listesi 3 item.xml
dosyası oluşturulur. Şöyle görünüyor:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ns1:item ns1:id="2" xmlns:ns1="http://blogs.sun.com/teera/ns/item">
<ns1:itemName>Foo</ns1:itemName>
<ns1:price>200</ns1:price>
</ns1:item>
Kolay değil mi? Alternatif olarak, marshal (...) yönteminin parametresini aşağıdaki gibi değiştirerek çıktı XML'sini metin Dizesi, Akış, Yazar, ContentHandler vb. Olarak yönlendirebilirsiniz.
...
JAXBContext context = JAXBContext.newInstance(item.getClass());
Marshaller marshaller = context.createMarshaller();
// save xml output to the OutputStream instance
marshaller.marshal(item, <java.io.OutputStream instance>);
...
JAXBContext context = JAXBContext.newInstance(item.getClass());
Marshaller marshaller = context.createMarshaller();
StringWriter sw = new StringWriter();
//save to StringWriter, you can then call sw.toString() to get java.lang.String
marshaller.marshal(item, sw);
XML'den POJO'ya
Süreci tersine çevirelim. Şimdi bir parça XML dizgi verisine sahip olduğumu ve bunu Item.java nesnesine dönüştürmek istediğimi varsayalım. XML verileri (Kod listesi 3) şuna benzer:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ns1:item ns1:id="2" xmlns:ns1="http://blogs.sun.com/teera/ns/item">
<ns1:itemName>Bar</ns1:itemName>
<ns1:price>80</ns1:price>
</ns1:item>
Daha sonra bu xml kodunu Item nesnesine göre
...
ByteArrayInputStream xmlContentBytes = new ByteArrayInputStream (xmlContent.getBytes());
JAXBContext context = JAXBContext.newInstance(Item.getClass());
Unmarshaller unmarshaller = context.createUnmarshaller();
//note: setting schema to null will turn validator off
unmarshaller.setSchema(null);
Object xmlObject = Item.getClass().cast(unmarshaller.unmarshal(xmlContentBytes));
return xmlObject;
...
Kod Listesinin tamamı için lütfen Kod Listesi 2'ye (main.java) bakın. XML kaynağı hem Akıştan hem de dosyadan birçok biçimde gelebilir. Tek fark yine yöntem parametresidir:
...
unmarshaller.unmarshal(new File("Item.xml")); // reading from file
...
// inputStream is an instance of java.io.InputStream, reading from stream
unmarshaller.unmarshal(inputStream);
XML Şeması ile Doğrulama
Burada bahsetmek istediğim son şey, Java nesnesinin eşlemesini kaldırmadan önce giriş XML'sini şema ile doğrulamaktır. İtem.xsd adında bir XML şema dosyası oluşturuyorum. Kod Listelemenin tamamı için lütfen Kod Listeleme 4'e (Öğe.xsd) bakın. Şimdi yapmam gereken, bu şemayı doğrulama için kaydettirmek.
...
Schema schema = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI)
.newSchema(new File("Item.xsd"));
unmarshaller.setSchema(schema); //register item.xsd shcema for validation
...
XML verilerini POJO'ya göndermeye çalıştığımda, giriş XML'si şemaya uygun değilse, istisna yakalanacak. Kod Listesinin tamamı için lütfen Kod Listeleme 5'e (geçersiz_item.xml) bakın.
javax.xml.bind.UnmarshalException
- with linked exception:
javax.xml.bind.JAXBException caught: null
[org.xml.sax.SAXParseException: cvc-datatype-valid.1.2.1: 'item1' is
not a valid value for 'integer'.]
Burada 'id' özniteliğini tamsayı yerine dizge olarak değiştiriyorum.
XML girişi şemaya göre geçerliyse, XML verileri Item.java nesnesine başarılı bir şekilde sıralanacaktır.