Java XML

Java ile XML oluşturma, okuma, yazma gibi XML işlemlerinde kullanılan DOM, SAX, JAXB kütüphaneleri ve kullanımı ile ilgili bilgiler yer alıyor.

XML hakkında detaylı bilgi almak için XML Nedir? yazıma bakmalısın.

Java XML işlemleri

Java içerisinde XML işlemleri için DOM, SAX, StAX, JAXB gibi bir çok paket ve sınıf yer alır.

Paketlerin kullanımı yapılacak olan XML işlemine göre farklılık gösterir.

Java DOM

DOM yönteminde XML dosyasında yer alan veriler belleğe bilgisayar bilimlerinde yer alan ağaç veri modeline göre yerleştirilir ve erişim sağlanır.

XML dosyasını okumak için DocumentBuilderFactory ve DocumentBuilder soyut sınıfları aşağıdaki gibi kullanılır.

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();

DocumentBuilder sınıfında yer alan parse metotları ile dosya kaynağı belirtilerek XML dosyası belleğe yüklenir.

Document parse(InputStream is);
Document parse(InputStream is, String systemId);
Document parse(String uri);
Document parse(File f);
Document parse(InputSource is);

Metot geri dönüş olarak Document arayüzünü uygulayan bir sınıf döndürür.

Document document = builder.parse(xmlDosyasi);

Document arayüzünde yer alan metotlar kullanılarak XML işlemleri yapılır.

DOM XML okuma

DOM ile XML okuma işlemi için Document arayüzünde yer alan getDocumentElement, getFirstChild, getLastChild, getNextSibling, getPreviousSibling, getAttribute vb. metotlar kullanılır.

Örneğin; XML dosyasındaki kök etiket hakkında bilgi almak için getDocumentElement metodu kullanılır.

Metot dönüş olarak Element türünden bir nesne dönderecektir.

Element kokElement = document.getDocumentElement();
System.out.println(kokElement.getNodeName());

Element arayüzünde yer alan metotlar kullanılarak kök altında yer alan XML etiket ve niteliklerine erişim sağlanır.

NodeList kisiListesi = kokElement.getElementsByTagName("kisi");
System.out.println("Kişi sayısı: " + kisiListesi.getLength());

NodeList arayüzünde kullanılan metotlar kullanılarak etiket listesine erişim sağlanır.

for (int i = 0, len = kisiListesi.getLength(); i < len; i++) {
    Node kisi = kisiListesi.item(i);
    Element kisiElement = (Element) kisi;
    String kisiSira = kisiElement.getElementsByTagName("sira").item(0).getTextContent();
    String kisiAdi = kisiElement.getElementsByTagName("adi").item(0).getTextContent();
    String kisiSoyadi = kisiElement.getElementsByTagName("soyadi").item(0).getTextContent();
    System.out.println(kisiSira + " " + kisiAdi + " " + kisiSoyadi);
}

Örnek uygulama aşağıdaki gibidir.

public class JavaXML {

    public static void main(String[] args) {

        String xmlDosyasi = "kisiler.xml";

        try {
            DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
            DocumentBuilder builder = factory.newDocumentBuilder();
            Document document = builder.parse(xmlDosyasi);

            Element kokElement = document.getDocumentElement();
            System.out.println(kokElement.getNodeName());

            NodeList kisiListesi = kokElement.getElementsByTagName("kisi");
            System.out.println("Kişi sayısı: " + kisiListesi.getLength());

            for (int i = 0; i < kisiListesi.getLength(); i++) {
                Node kisi = kisiListesi.item(i);
                Element kisiElement = (Element) kisi;
                String kisiSira = kisiElement.getElementsByTagName("sira").item(0).getTextContent();
                String kisiAdi = kisiElement.getElementsByTagName("adi").item(0).getTextContent();
                String kisiSoyadi = kisiElement.getElementsByTagName("soyadi").item(0).getTextContent();
                System.out.println(kisiSira + " " + kisiAdi + " " + kisiSoyadi);
            }

        } catch (Exception ex) {
            System.err.println(ex);
        }

    }

}

DOM ile okuma işlemi için Node, Element, Attr, Text, Document arayüzlerinde yer alan metotlarını bilmek faydalı olacaktır.

DOM XML oluşturma

DOM ile XML oluşturma işlemi için Document arayüzünde yer alan createElement, createTextNode, createComment, createAttribute vb. create ile başlayan metotlar kullanılır.

XML oluşturma işleminde ilk olarak kök etiket oluşturulur ve daha sonra kök etiket altına appendChild metodu ile diğer etiketler eklenir.

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document document = builder.newDocument();

Element kokElement = document.createElement("kisiler");
document.appendChild(kokElement);

Element kisiElement = document.createElement("kisi");
kokElement.appendChild(kisiElement);

Element siraElement = document.createElement("sira");
siraElement.appendChild(document.createTextNode("1"));
kisiElement.appendChild(siraElement);

Element adiElement = document.createElement("adi");
adiElement.appendChild(document.createTextNode("Yusuf"));
kisiElement.appendChild(adiElement);

Element soyadiElement = document.createElement("soyadi");
soyadiElement.appendChild(document.createTextNode("SEZER"));
kisiElement.appendChild(soyadiElement);

XML oluşturma işleminden sonra TransformerFactory, DOMSource, StreamResult sınıfları ile XML yazdırma işlemi yapılır.

TransformerFactory transformerFactory = TransformerFactory.newInstance();
Transformer transformer = transformerFactory.newTransformer();
DOMSource source = new DOMSource(document);
StreamResult result = new StreamResult(new File(xmlDosyasi));
transformer.transform(source, result);

Yazdırma işleminde girinti ekleme gibi bazı ayarlar için setOutputProperty metodu kullanılır.

transformer.setOutputProperty(OutputKeys.INDENT, "yes");
transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "4");

Örnek uygulama aşağıdaki gibidir.

public class JavaXML {

    public static void main(String[] args) {

        String xmlDosyasi = "kisiler_test.xml";

        try {
            DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
            DocumentBuilder builder = factory.newDocumentBuilder();
            Document document = builder.newDocument();

            Element kokElement = document.createElement("kisiler");
            document.appendChild(kokElement);

            Element kisiElement = document.createElement("kisi");
            kokElement.appendChild(kisiElement);

            Element siraElement = document.createElement("sira");
            siraElement.appendChild(document.createTextNode("1"));
            kisiElement.appendChild(siraElement);

            Element adiElement = document.createElement("adi");
            adiElement.appendChild(document.createTextNode("Yusuf"));
            kisiElement.appendChild(adiElement);

            Element soyadiElement = document.createElement("soyadi");
            soyadiElement.appendChild(document.createTextNode("SEZER"));
            kisiElement.appendChild(soyadiElement);

            // DOM XML yazdırma
            TransformerFactory transformerFactory = TransformerFactory.newInstance();
            Transformer transformer = transformerFactory.newTransformer();
            transformer.setOutputProperty(OutputKeys.INDENT, "yes");
            transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "4");
            DOMSource source = new DOMSource(document);
            StreamResult result = new StreamResult(new File(xmlDosyasi));
            transformer.transform(source, result);

        } catch (Exception ex) {
            System.err.println(ex);
        }

    }

}

Java SAX

SAX yöntemi DOM yöntemine göre daha az bellek kullanır.

Ancak SAX ile XML verilerini okumak DOM yöntemine göre daha zor olabilir.

SAX ile XML dosyalarını okumak için SAXParserFactory ve SAXParser soyut sınıfları aşağıdaki gibi kullanılır.

SAXParserFactory factory = SAXParserFactory.newInstance();
SAXParser parser = factory.newSAXParser();

SAXParser sınıfında yer alan parse metotları ile dosya kaynağı belirtilerek XML dosyası yukarıdan aşağıya doğru okunur.

void parse(String uri, DefaultHandler dh);
void parse(InputStream is, DefaultHandler dh);
void parse(InputStream is, DefaultHandler dh, String systemId);
void parse(File f, DefaultHandler dh);
void parse(InputSource is, DefaultHandler dh);

Metot DefaultHandler sınıfındaki çeşitli metotları çalıştırır.

SAX XML okuma

SAX ile XML okuma işlemi için DefaultHandler sınıfında yer alan startDocument, endDocument, startElement, endElement vb. metotlar kullanılır.

Örneğin; XML okuma işlemi başladığında startDocument metodu çalıştırılır.

Etiket başlangıcında startElement metodu çalıştırılır ve etiket ile ilgili bilgiler parametre olarak gönderilir.

public class KisilerHandler extends DefaultHandler {

    @Override
    public void startDocument() throws SAXException {
        System.out.println("Okuma başladı.");
    }

    @Override
    public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
        //System.out.println(qName);
    }

    @Override
    public void characters(char[] ch, int start, int length) throws SAXException {
        String value = new String(ch, start, length).trim();

        if (value.length() == 0) {
            return;
        }

        System.out.println(value);
    }

    @Override
    public void endDocument() throws SAXException {
        System.out.println("Okuma bitti.");
    }

}

Örnek uygulama aşağıdaki gibidir.

public class JavaXML {

    public static void main(String[] args) {

        String xmlDosyasi = "kisiler.xml";

        try {

            SAXParserFactory factory = SAXParserFactory.newInstance();
            SAXParser parser = factory.newSAXParser();
            parser.parse(xmlDosyasi, new KisilerHandler());

        } catch (Exception ex) {
            System.err.println(ex);
        }

    }

}

Java SAX XML oluşturma

SAX ile XML oluşturma işlemi yapılmamaktadır.

Bunun yerine dosya yazdırma (I/O) sınıfları kullanılır.

Java JAXB

Java ile XML işlemlerinde en çok kullanılan ve en kolay yöntem JAXB yöntemidir.

JAXB XML oluşturma

Bu yöntemde XML etiketleri için java sınıfı oluşturulur ve annotation ile etiketlenerek işlem yapılır.

class Kisi {

    int sira;
    String adi;
    String soyadi;

    public int getSira() {
        return sira;
    }

    public void setSira(int sira) {
        this.sira = sira;
    }

    public String getAdi() {
        return adi;
    }

    public void setAdi(String adi) {
        this.adi = adi;
    }

    public String getSoyadi() {
        return soyadi;
    }

    public void setSoyadi(String soyadi) {
        this.soyadi = soyadi;
    }

}

XML dosyasında bulunan kök etiket birden fazla eleman içereceğinden koleksiyon yapısı kullanılır.

@XmlRootElement
class Kisiler {

    private List<Kisi> kisiler = null;

    public List<Kisi> getKisiler() {
        return kisiler;
    }

    @XmlElement(name = "kisi")
    public void setKisiler(List<Kisi> kisiler) {
        this.kisiler = kisiler;
    }

}

JAXB içerisinde ayrıca @XmlElement, @XmlAttribute, @XmlAccessorType gibi annotations yer alır.

Annotations hakkında detaylı bilgi için Java Annotations yazıma bakabilirsiniz.

XML içerisinde yer alacak değerleri içeren nesne oluşturulur.

Kisiler kisiler = new Kisiler();
kisiler.setKisiler(new ArrayList<>());

Kisi kisiYusuf = new Kisi();
kisiYusuf.setSira(1);
kisiYusuf.setAdi("Yusuf");
kisiYusuf.setSoyadi("SEZER");
kisiler.getKisiler().add(kisiYusuf);

Oluşturulan nesneler JAXBContext sınıfı ve Marshaller arayüzü ile XML formatına(marshaller) çevrilir.

JAXBContext context = JAXBContext.newInstance(Kisiler.class);
Marshaller marshaller = context.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);

Marshaller arayüzünde yer alan marshal metotları ile oluşturulan XML istenilen yere yazdırılır.

marshaller.marshal(kisiler, System.out);

Örnek uygulama aşağıdaki gibidir.

public class JavaXML {

    public static void main(String[] args) {

        String xmlDosyasi = "kisiler.xml";

        Kisiler kisiler = new Kisiler();
        kisiler.setKisiler(new ArrayList<>());

        Kisi kisiYusuf = new Kisi();
        kisiYusuf.setSira(1);
        kisiYusuf.setAdi("Yusuf");
        kisiYusuf.setSoyadi("SEZER");
        kisiler.getKisiler().add(kisiYusuf);

        try {

            JAXBContext context = JAXBContext.newInstance(Kisiler.class);
            Marshaller marshaller = context.createMarshaller();
            marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);

            marshaller.marshal(kisiler, new File(xmlDosyasi));

        } catch (Exception ex) {
            System.err.println(ex);
        }

    }

}

JAXB XML okuma

Okuma işlemi için ilk olarak okunacak XML yapısına uygun sınıf oluşturulur ve gerekli annotations eklenir.

Yapı oluşturulduktan sonra JAXBContext sınıfı ve Unmarshaller arayüzü kullanılarak java veri yapısına çevrilir.

Örnek uygulama aşağıdaki gibidir.

public class JavaXML {

    public static void main(String[] args) {

        String xmlDosyasi = "kisiler.xml";

        try {

            JAXBContext context = JAXBContext.newInstance(Kisiler.class);
            Unmarshaller unmarshaller = context.createUnmarshaller();

            Kisiler kisiler = (Kisiler) unmarshaller.unmarshal(new File(xmlDosyasi));

            for (Kisi kisi : kisiler.getKisiler()) {
                System.out.println(kisi.getSira() + " " + kisi.getAdi() + " " + kisi.getSoyadi());
            }
        } catch (Exception ex) {
            System.err.println(ex);
        }

    }

}

Java ile XML işlemleri için ayrıca DOM4J, JDOM gibi çeşitli kütüphaneler yer almaktadır.

Bu kütüphanelerde XML işlemine göre Java içerisinde yer alan DOM ve SAX yöntemlerini kullanır.

Java Derslerine buradan ulaşabilirsiniz.

Hayırlı günler dilerim.

Yusuf SEZER

Yusuf SEZER

Computer Engineer who interested about web technologies, algorithms, artificial intelligence and embedded systems; constantly exploring new technologies.


Bunlara'da bakmalısın!