Jan 1, 0001  

title: Java Dersleri 11 - XML Okuma - Yazma İşlemleri link: http://orhanbalci.net/tr/?p=357 author: Orhan Balci description: post_id: 357 created: 2009/10/01 20:12:34 created_gmt: 2009/10/01 17:12:34 comment_status: open post_name: java-dersleri-11-xml-okuma-yazma-islemleri status: publish post_type: post

Java Dersleri 11 - XML Okuma - Yazma İşlemleri

[caption id=“attachment_829” align=“aligncenter” width=“600” caption=“Java dersleri 11 XML İşlemleri”]Java dersleri 11 XML İşlemleri[/caption] Bu dersimizde Java’nın XML işlemleri için kullanılan sınıflarının genel özelliklerini öğreneceğiz. XML hiyerarşik ve özyineli yapısı sayesinde günümüz uygulamalarında standartlaşmış bir veri iletim ve depolama biçimidir. Özellikle Web 2.0 ile önemi web tarafında da iyice ortaya çıkan XML biçimli dosyaları uygulamalarımızda işlemek kaçınılmaz olduğuna göre bu işin Java’da nasıl yapıldığına bir göz atalım. Geliştirdiğimiz uygulamaya göre XML’den veri okuyor olabileceğimiz gibi ürettiğimiz veriyi XML biçiminde yazmak da isteyebiliriz. Okuyup yazdığımız XML biçimi standartlaşmış, dünya çapında kullanılan bir biçim olabileceği gibi (RSS,XSPF), biçimini bizim geliştirdiğimiz veriler de olabilir. Örneğin bir çoklu ortam oynatıcısı(multimedia player) geliştirdiğimizi düşünelim. Oynatmak istediğimiz mp3 dosyaları olsun video dosyaları olsun bunların bir listede kayıtlı olması lazım. XSPF (XML Sharable Playlist Format) bu listeyi XML biçiminde saklamaya yarayan bir standarttır. [xml] <?xml version=“1.0” encoding=“UTF-8”?> LimeWire/Saved/Melihat Gülses - Incesaz - Cok Asigin Var Diyorlar.mp3 file:///media/VM/MP3/Aldirma Gonul.mp3 </playlis [/xml] Eğer bu biçimi desteklemek istiyorsak yukarıdaki XML dosya tipini okuyabiliyor olmalıyız. Java’da XML işlemlerini yapabilmek için bir org.w3c.dom.Document arayüzünü gerçekleyen bir nesne oluşturmalıyız. Bu nesne XML ağacını (XML içeriğine hiyerarşik yapısından dolayı verilen ad) tüm özellikleriyle hafızada tutar. Herhangi bir XML dosyasından Document nesnesi oluşturma işlemini ise DocumentBuilder sınıfı yapar. DocumentBuilder sınıfı soyut bir sınıf olduğundan farklı alt sınıfları tarafından farklı XML parçalama (parse) algoritmaları gerçeklenir. Bu algoritmalar iteratif yada öz yineli (recursive) olabilir. DocumentBuilder nesnesini ise DocumentBuilderFactory sınıfı üzerinden elde ederiz. Bu işlemin kodunu görelim : [java] DocumentBuilder builder = null; Document doc = null; try { builder = DocumentBuilderFactory.newInstance().newDocumentBuilder(); doc = builder.parse(new File(fileName)); } catch (ParserConfigurationException ex) { ex.printStackTrace(); } catch (IOException ex) { ex.printStackTrace(); } catch (SAXException ex) { ex.printStackTrace(); } [/java] Document nesnesi elde edildikten sonra ihtiyacımız olan XML elemanlarına ulaşma kolaydır. Örneğin yukarıdaki örnek XML dosyasındaki etiketleri arasındaki veriyi almak istiyorsak Document arayüzünün getElementsByTagName metodunu kullanabiliriz. Bu metod bize bir düğüm listesi döndürecektir. Bu düğüm listesi üzerinden bir bir giderek tüm metinlerini okuyabiliriz. Eğer dosyanın tamamına düğüm düğüm ulaşmak istiyorsak XML’in ağaç yapısından yararlanmalıyız. Bunun için önce kök düğüme ulaşmalıyız. Document arayüzünün getDocumentElement metodu bize kök elemanı verecektir. Bu kök elemanın çocuk elemanlarına oradan da onların çocuklarına gidebiliriz. Yukarıdaki XML örneğinden location etiketleri arasındaki metni okumak istersek : [java] NodeList songs = doc.getElementsByTagName(“location”); if(songs.getLength() != 0) { model = new PlayListModel(); } for (int i = 0; i < songs.getLength(); i++) { model.addSong(songs.item(i).getTextContent()); } [/java] Burada getElementsByTagName ve getTextContent metodlarına dikkat edelim. getTextContent metodu Node arayüzüne dahil olup o düğümün metin içeriğini almaya yarar. XML Yazma işlemi de yine okuma işlemi gibi Document nesneleri üzerinden yürütülür. Hafızadaki herhangi bir veriyi XML olarak yazabilmek için öncelikle bu veriden bir DOM ağacı oluşturmalıyız. Örneğin elimizdeki şarkı listesinden DOM ağacı oluşturmak için : [java] private static Document createDOM(final IPlayListModel playListToBeExported) throws DOMException { DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = null; Document doc = null; Element root = null; try { builder = factory.newDocumentBuilder(); doc = builder.newDocument(); root = (Element) doc.createElement(“playlist”); doc.appendChild(root); } catch (ParserConfigurationException ex) { ex.printStackTrace(); } if(root != null) { List songList = playListToBeExported.getSongList(); for(int i = 0; i < songList.size(); i++) { Element el = doc.createElement(“location”); el.setTextContent((String)songList.get(i)); // el.setNodeValue(); root.appendChild(el); } } return doc; } [/java] DOM ağacında herhangi bir düğüme çocuk düğüm eklemek için appendChild metodunu, herhangi bir düğümün metin içeriğini girmek için ise setTextContent metodunu kullanıyoruz. DOM ağacımızı dosyaya yazmak için ise javax.xml.transform paketi sınıflarını kullanabiliriz. Bu paketten Source, Result arayüzleri Transformer soyut sınıfı aracılığıyla herhangi bir DOM ağacını çeşitli çıktılara yönlendirebiliriz. DOM ağacımızı dosyaya yazmak için : [java] private static void writeDocToFile(Document doc, String fileName) { try { JFileChooser ch = new JFileChooser(); if (ch.showSaveDialog(null) == JFileChooser.APPROVE_OPTION) { Source source = new DOMSource(doc); File file = new File(ch.getSelectedFile().getAbsolutePath()); Result result = new StreamResult(file); Transformer xformer = TransformerFactory.newInstance().newTransformer(); xformer.transform(source, result); } } catch (TransformerConfigurationException e) { } catch (TransformerException e) { } } [/java] [ad#Yazi Ici Buyuk]

Comments

adas: birazdaha basit ve açıklayıcı anlatsanız daha iyi olur :roll:

admin: Selin Hanım bu iki method benim yazmış olduğum kod parçaları. Fakat bunlar xml’in okunmasında kullanılan şeyler değil. Burada önemli olan methodlar getElementsByTagName() ve getTextContent() methodları. Kodunuzu ve ne yapmak istediğinizi maille gönderirseniz yardımcı olayım.

Selin: Merhaba; Soracağım şey şu ki ben java kodunda xml dosyasını parse etmeye çalışıyorum, bayağı komplex bir dosya var elimde bir root ve onun altında bir sürü tag açılmış kapanmış. Ben xml in ağaç yapısını kullanarak parse etmeye çalışıyorum en başta root umu aldım kodumda, daha sonra sizin kodunuzdan faydalandım ancak PlaylistModel ve addSong bu iki metod u herhangi bir arayüzden import mu ettiniz yoksa kendiniz mi yazdınız içeriğini, bayağı araştırdım fakat bulamadım, şimdiden teşekkürler.

begüm: Erkeklere neden cevap vermiyorsunuz?

admin: Elimden geldigince herkese cevap vermeye calisiyorum. Erkek, kadin ayirmiyorum.

Erkan: İyi günler; ben dinamik olarak bir sitemap yaratmak istiyorum. Yani bir sitenin https://www.x.com/abc/" + nereden + @“/” + nereye + @“/k/” + tools.rewritecontrol(buradan) + @“-” +tools.rewritecontrol(buraya) + @“-kim-nerde”) x.com’dan verileri nasıl çekebilirim..teşekkürler