{"id":35368,"date":"2025-11-28T22:40:53","date_gmt":"2025-11-28T19:40:53","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/?p=35368"},"modified":"2025-11-28T22:40:53","modified_gmt":"2025-11-28T19:40:53","slug":"java-sax-parser-ile-xml-belge-isleme-kapsamli-bir-rehber","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/java-sax-parser-ile-xml-belge-isleme-kapsamli-bir-rehber\/","title":{"rendered":"Java SAX Parser ile XML Belge \u0130\u015fleme: Kapsaml\u0131 Bir Rehber"},"content":{"rendered":"<p><body><\/p>\n<h2>Java SAX Parser ile XML Belge \u0130\u015fleme: Kapsaml\u0131 Bir Rehber<\/h2>\n<h3>Giri\u015f<\/h3>\n<p>G\u00fcn\u00fcm\u00fcz\u00fcn yaz\u0131l\u0131m d\u00fcnyas\u0131nda veri de\u011fi\u015fimi, uygulamalar aras\u0131 ileti\u015fim ve konfig\u00fcrasyon y\u00f6netimi gibi bir\u00e7ok alanda XML (Extensible Markup Language) vazge\u00e7ilmez bir rol oynamaktad\u0131r. XML, veriyi yap\u0131land\u0131r\u0131lm\u0131\u015f bir \u015fekilde depolamak ve ta\u015f\u0131mak i\u00e7in kullan\u0131lan, insan taraf\u0131ndan okunabilir ve makine taraf\u0131ndan i\u015flenebilir bir bi\u00e7imdir. Java platformu, XML belgelerini ayr\u0131\u015ft\u0131rmak, olu\u015fturmak ve manip\u00fcle etmek i\u00e7in g\u00fc\u00e7l\u00fc API&#8217;ler sunar. Bu API&#8217;ler aras\u0131nda en temel ve performans odakl\u0131 olanlardan biri SAX (Simple API for XML) Parser&#8217;d\u0131r.<\/p>\n<p>Bu makale, Java SAX Parser&#8217;\u0131n ne oldu\u011funu, nas\u0131l \u00e7al\u0131\u015ft\u0131\u011f\u0131n\u0131 ve ger\u00e7ek d\u00fcnya senaryolar\u0131nda nas\u0131l kullan\u0131laca\u011f\u0131n\u0131 detayl\u0131 bir \u015fekilde a\u00e7\u0131klamay\u0131 hedeflemektedir. SAX&#8217;\u0131n mimarisini, kullan\u0131m ad\u0131mlar\u0131n\u0131, kapsaml\u0131 \u00f6rneklerle pratik uygulamalar\u0131n\u0131 ve di\u011fer XML ayr\u0131\u015ft\u0131rma y\u00f6ntemleriyle kar\u015f\u0131la\u015ft\u0131rmas\u0131n\u0131 ele alaca\u011f\u0131z. \u00d6zellikle b\u00fcy\u00fck XML dosyalar\u0131yla \u00e7al\u0131\u015f\u0131rken SAX&#8217;\u0131n sundu\u011fu avantajlar\u0131 ve dikkat edilmesi gereken noktalar\u0131 vurgulayaca\u011f\u0131z.<\/p>\n<h3>XML Ayr\u0131\u015ft\u0131rma Y\u00f6ntemlerine Genel Bak\u0131\u015f<\/h3>\n<p>Java, XML belgelerini i\u015flemek i\u00e7in birden fazla yakla\u015f\u0131m sunar. Bu yakla\u015f\u0131mlar, bellek kullan\u0131m\u0131, h\u0131z, belgeye eri\u015fim \u015fekli ve manip\u00fclasyon yetenekleri a\u00e7\u0131s\u0131ndan farkl\u0131l\u0131k g\u00f6sterir. SAX&#8217;\u0131 anlamadan \u00f6nce, di\u011fer pop\u00fcler y\u00f6ntemleri k\u0131saca tan\u0131mak faydal\u0131 olacakt\u0131r.<\/p>\n<h4>DOM (Document Object Model)<\/h4>\n<p>DOM, XML belgesini belle\u011fe y\u00fckleyerek bir a\u011fa\u00e7 yap\u0131s\u0131 (node&#8217;lar, elementler, attribute&#8217;lar vb.) olu\u015fturur. Bu a\u011fa\u00e7 yap\u0131s\u0131 sayesinde belge \u00fczerinde ileri-geri gezinmek, elemanlara rastgele eri\u015fmek, belgeyi de\u011fi\u015ftirmek ve yeni elemanlar eklemek m\u00fcmk\u00fcnd\u00fcr.<br \/>\n*   <strong>Avantajlar\u0131:<\/strong> Belgeye tam eri\u015fim, kolay manip\u00fclasyon, a\u011fa\u00e7 yap\u0131s\u0131 sayesinde sezgisel navigasyon.<br \/>\n*   <strong>Dezavantajlar\u0131:<\/strong> T\u00fcm belgeyi belle\u011fe y\u00fckledi\u011fi i\u00e7in b\u00fcy\u00fck XML dosyalar\u0131nda y\u00fcksek bellek t\u00fcketimi, performans d\u00fc\u015f\u00fc\u015f\u00fc ya\u015fanabilir.<\/p>\n<h4>SAX (Simple API for XML)<\/h4>\n<p>SAX, olay tabanl\u0131 (event-driven) ve ak\u0131\u015f tabanl\u0131 (stream-based) bir ayr\u0131\u015ft\u0131r\u0131c\u0131d\u0131r. XML belgesini sat\u0131r sat\u0131r okur ve belirli olaylar (bir elementin ba\u015flamas\u0131, bitmesi, metin i\u00e7eri\u011fi vb.) tetiklendi\u011finde kullan\u0131c\u0131 tan\u0131ml\u0131 metotlar\u0131 \u00e7a\u011f\u0131r\u0131r. SAX, belgeyi belle\u011fe y\u00fcklemez; bu nedenle \u00e7ok b\u00fcy\u00fck XML dosyalar\u0131 i\u00e7in idealdir.<br \/>\n*   <strong>Avantajlar\u0131:<\/strong> D\u00fc\u015f\u00fck bellek kullan\u0131m\u0131, y\u00fcksek performans, b\u00fcy\u00fck dosyalar i\u00e7in uygun.<br \/>\n*   <strong>Dezavantajlar\u0131:<\/strong> Belge \u00fczerinde ileri-geri gezinme veya de\u011fi\u015ftirme imkan\u0131 yoktur, sadece tek y\u00f6nl\u00fc okuma yapar. Karma\u015f\u0131k belgelerde durum y\u00f6netimi gerektirebilir.<\/p>\n<h4>StAX (Streaming API for XML)<\/h4>\n<p>StAX, SAX ve DOM&#8217;un avantajlar\u0131n\u0131 birle\u015ftirmeyi ama\u00e7layan bir \u00e7ekme (pull) ayr\u0131\u015ft\u0131r\u0131c\u0131s\u0131d\u0131r. SAX gibi ak\u0131\u015f tabanl\u0131d\u0131r ve d\u00fc\u015f\u00fck bellek kullan\u0131r, ancak DOM gibi geli\u015ftiriciye belgeden ne zaman veri \u00e7ekece\u011fi konusunda daha fazla kontrol sa\u011flar. Geli\u015ftirici, bir sonraki olay\u0131 ne zaman okuyaca\u011f\u0131na kendisi karar verir.<br \/>\n*   <strong>Avantajlar\u0131:<\/strong> D\u00fc\u015f\u00fck bellek kullan\u0131m\u0131, SAX&#8217;a g\u00f6re daha esnek kontrol, DOM&#8217;a g\u00f6re daha performansl\u0131.<br \/>\n*   <strong>Dezavantajlar\u0131:<\/strong> SAX&#8217;a g\u00f6re biraz daha karma\u015f\u0131k bir API.<\/p>\n<h4>JAXB (Java Architecture for XML Binding)<\/h4>\n<p>JAXB, XML belgelerini Java nesnelerine d\u00f6n\u00fc\u015ft\u00fcrmek (unmarshalling) ve Java nesnelerini XML belgelerine d\u00f6n\u00fc\u015ft\u00fcrmek (marshalling) i\u00e7in kullan\u0131lan bir API&#8217;dir. XML \u015femas\u0131ndan Java s\u0131n\u0131flar\u0131 olu\u015fturabilir veya mevcut Java s\u0131n\u0131flar\u0131ndan XML \u015femas\u0131 t\u00fcretebilir.<br \/>\n*   <strong>Avantajlar\u0131:<\/strong> XML ve Java nesneleri aras\u0131nda kolay d\u00f6n\u00fc\u015f\u00fcm, geli\u015ftirme h\u0131z\u0131n\u0131 art\u0131r\u0131r.<br \/>\n*   <strong>Dezavantajlar\u0131:<\/strong> Performans a\u00e7\u0131s\u0131ndan SAX&#8217;tan yava\u015f olabilir, b\u00fcy\u00fck dosyalar i\u00e7in bellek t\u00fcketimi y\u00fcksek olabilir.<\/p>\n<p>Bu ayr\u0131\u015ft\u0131r\u0131c\u0131lar aras\u0131nda SAX, \u00f6zellikle sadece XML verisini okuman\u0131z gerekti\u011finde ve bellek k\u0131s\u0131tlamalar\u0131 veya performans endi\u015feleri oldu\u011funda tercih edilmesi gereken bir \u00e7\u00f6z\u00fcmd\u00fcr.<\/p>\n<h3>SAX Parser Mimarisi ve \u00c7al\u0131\u015fma Prensibi<\/h3>\n<p>SAX Parser, XML belgesini bir veri ak\u0131\u015f\u0131 olarak i\u015fler. Belgeyi ba\u015ftan sona tek ge\u00e7i\u015fte okur ve belirli yap\u0131sal \u00f6\u011felerle kar\u015f\u0131la\u015ft\u0131\u011f\u0131nda (\u00f6rne\u011fin, bir elementin ba\u015flang\u0131c\u0131, bir elementin sonu, metin i\u00e7eri\u011fi) bir &#8220;olay&#8221; tetikler. Bu olaylar\u0131 yakalamak ve i\u015flemek i\u00e7in <code>ContentHandler<\/code> aray\u00fcz\u00fcn\u00fc uygulayan \u00f6zel bir s\u0131n\u0131f yazmam\u0131z gerekir.<\/p>\n<p>SAX&#8217;\u0131n temel bile\u015fenleri \u015funlard\u0131r:<\/p>\n<p>1.  <strong><code>SAXParserFactory<\/code><\/strong>: SAX ayr\u0131\u015ft\u0131r\u0131c\u0131lar\u0131n\u0131n olu\u015fturulmas\u0131 i\u00e7in bir fabrika s\u0131n\u0131f\u0131d\u0131r. <code>SAXParser<\/code> \u00f6rneklerini \u00fcretir.<br \/>\n2.  <strong><code>SAXParser<\/code><\/strong>: XML belgesini ayr\u0131\u015ft\u0131rmak i\u00e7in kullan\u0131lan ana s\u0131n\u0131ft\u0131r. Bu s\u0131n\u0131f, bir <code>XMLReader<\/code> \u00f6rne\u011fi sa\u011flar.<br \/>\n3.  <strong><code>XMLReader<\/code><\/strong>: SAX ayr\u0131\u015ft\u0131rmas\u0131n\u0131n \u00e7ekirde\u011fidir. <code>ContentHandler<\/code>&#8216;\u0131 ayarlar ve ayr\u0131\u015ft\u0131rma i\u015flemini ba\u015flat\u0131r.<br \/>\n4.  <strong><code>ContentHandler<\/code><\/strong>: SAX olaylar\u0131n\u0131 i\u015flemek i\u00e7in uygulaman\u0131z\u0131n yazmas\u0131 gereken aray\u00fczd\u00fcr. Bu aray\u00fcz, <code>startDocument()<\/code>, <code>endDocument()<\/code>, <code>startElement()<\/code>, <code>endElement()<\/code>, <code>characters()<\/code> gibi metotlar\u0131 i\u00e7erir.<br \/>\n5.  <strong><code>DefaultHandler<\/code><\/strong>: <code>ContentHandler<\/code>, <code>ErrorHandler<\/code>, <code>DTDHandler<\/code> ve <code>EntityResolver<\/code> aray\u00fczlerini uygulayan kolayl\u0131k sa\u011flayan bir s\u0131n\u0131ft\u0131r. Genellikle bu s\u0131n\u0131f\u0131 geni\u015fleterek kendi \u00f6zel olay i\u015fleyicimizi yazar\u0131z, \u00e7\u00fcnk\u00fc t\u00fcm metotlar\u0131 bo\u015f bir \u015fekilde uygular ve sadece ihtiyac\u0131m\u0131z olanlar\u0131 ge\u00e7ersiz k\u0131lmam\u0131za olanak tan\u0131r.<\/p>\n<p><strong>\u00c7al\u0131\u015fma Prensibi:<\/strong><br \/>\nBir XML belgesi SAX Parser&#8217;a verildi\u011finde, ayr\u0131\u015ft\u0131r\u0131c\u0131 belgeyi bayt bayt okumaya ba\u015flar.<br \/>\n*   Belgenin ba\u015f\u0131na ula\u015f\u0131ld\u0131\u011f\u0131nda <code>startDocument()<\/code> metodu \u00e7a\u011fr\u0131l\u0131r.<br \/>\n*   Bir elementin a\u00e7\u0131l\u0131\u015f etiketiyle (<code><element><\/code>) kar\u015f\u0131la\u015f\u0131ld\u0131\u011f\u0131nda <code>startElement()<\/code> metodu \u00e7a\u011fr\u0131l\u0131r. Bu metot, elementin URI&#8217;sini, yerel ad\u0131n\u0131, niteliklerini (attributes) i\u00e7erir.<br \/>\n*   Elementin i\u00e7eri\u011findeki metinle kar\u015f\u0131la\u015f\u0131ld\u0131\u011f\u0131nda <code>characters()<\/code> metodu \u00e7a\u011fr\u0131l\u0131r. Metin, genellikle birden fazla \u00e7a\u011fr\u0131da par\u00e7alar halinde gelebilir.<br \/>\n*   Bir elementin kapan\u0131\u015f etiketiyle (<code><\/element><\/code>) kar\u015f\u0131la\u015f\u0131ld\u0131\u011f\u0131nda <code>endElement()<\/code> metodu \u00e7a\u011fr\u0131l\u0131r.<br \/>\n*   Belgenin sonuna ula\u015f\u0131ld\u0131\u011f\u0131nda <code>endDocument()<\/code> metodu \u00e7a\u011fr\u0131l\u0131r.<\/p>\n<p>Bu olay tabanl\u0131 yakla\u015f\u0131m sayesinde, ayr\u0131\u015ft\u0131r\u0131c\u0131 t\u00fcm belgeyi belle\u011fe y\u00fcklemek zorunda kalmaz. Veriyi an\u0131nda i\u015fler ve bellekte yaln\u0131zca o anki olayla ilgili k\u00fc\u00e7\u00fck bir veri par\u00e7as\u0131n\u0131 tutar.<\/p>\n<h3>SAX Parser Kullan\u0131m Ad\u0131mlar\u0131<\/h3>\n<p>SAX Parser kullanmak i\u00e7in temel ad\u0131mlar \u015funlard\u0131r:<\/p>\n<h4>1. XML Belgesi Haz\u0131rlama<\/h4>\n<p>\u00d6ncelikle ayr\u0131\u015ft\u0131rmak istedi\u011fimiz bir XML belgesine ihtiyac\u0131m\u0131z var. \u00d6rnek olarak, basit bir &#8220;kitaplar.xml&#8221; dosyas\u0131 olu\u015ftural\u0131m:<\/p>\n<pre><code class=\"language-xml\"><!-- kitaplar.xml -->\n<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<kitaplar>\n    <kitap id=\"1\">\n        <baslik>Java Programlama Temelleri<\/baslik>\n        <yazar>Ali Can<\/yazar>\n        <yil>2021<\/yil>\n        <fiyat paraBirimi=\"TL\">85.50<\/fiyat>\n    <\/kitap>\n    <kitap id=\"2\">\n        <baslik>Veri Yap\u0131lar\u0131 ve Algoritmalar<\/baslik>\n        <yazar>Ay\u015fe Y\u0131lmaz<\/yazar>\n        <yil>2019<\/yil>\n        <fiyat paraBirimi=\"USD\">39.99<\/fiyat>\n    <\/kitap>\n<\/kitaplar><\/code><\/pre>\n<h4>2. ContentHandler Uygulamas\u0131 Olu\u015fturma<\/h4>\n<p>SAX olaylar\u0131n\u0131 i\u015flemek i\u00e7in <code>org.xml.sax.helpers.DefaultHandler<\/code> s\u0131n\u0131f\u0131n\u0131 geni\u015fleten \u00f6zel bir s\u0131n\u0131f olu\u015fturmal\u0131y\u0131z. Bu s\u0131n\u0131f i\u00e7inde, ilgilendi\u011fimiz olay metotlar\u0131n\u0131 ge\u00e7ersiz k\u0131laca\u011f\u0131z.<\/p>\n<pre><code class=\"language-java\">\/\/ MySaxHandler.java\nimport org.xml.sax.Attributes;\nimport org.xml.sax.SAXException;\nimport org.xml.sax.helpers.DefaultHandler;\n\npublic class MySaxHandler extends DefaultHandler {\n\n    private StringBuilder currentValue = new StringBuilder();\n\n    @Override\n    public void startDocument() throws SAXException {\n        System.out.println(\"XML Belgesi Ayr\u0131\u015ft\u0131rmaya Ba\u015flad\u0131...\");\n    }\n\n    @Override\n    public void endDocument() throws SAXException {\n        System.out.println(\"XML Belgesi Ayr\u0131\u015ft\u0131rma Tamamland\u0131.\");\n    }\n\n    @Override\n    public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {\n        \/\/ qName: Nitelikli ad (prefix varsa prefix:localName)\n        \/\/ localName: Prefix'siz yerel ad\n        \/\/ attributes: Elementin nitelikleri\n\n        System.out.print(\"Element Ba\u015flad\u0131: <\" + qName);\n        if (attributes.getLength() > 0) {\n            System.out.print(\" [Nitelikler: \");\n            for (int i = 0; i < attributes.getLength(); i++) {\n                System.out.print(attributes.getQName(i) + \"=\" + attributes.getValue(i) + (i < attributes.getLength() - 1 ? \", \" : \"\"));\n            }\n            System.out.print(\"]\");\n        }\n        System.out.println(\">\");\n        currentValue.setLength(0); \/\/ Her yeni element ba\u015flad\u0131\u011f\u0131nda StringBuilder'\u0131 temizle\n    }\n\n    @Override\n    public void endElement(String uri, String localName, String qName) throws SAXException {\n        System.out.println(\"Element Bitti: <\/\" + qName + \">\");\n        if (currentValue.length() > 0) {\n            System.out.println(\"  \u0130\u00e7erik: \" + currentValue.toString().trim());\n        }\n        currentValue.setLength(0); \/\/ Element bitti\u011finde de StringBuilder'\u0131 temizle\n    }\n\n    @Override\n    public void characters(char[] ch, int start, int length) throws SAXException {\n        \/\/ Element i\u00e7eri\u011findeki metin verisi.\n        \/\/ Metin, birden fazla \u00e7a\u011fr\u0131da par\u00e7alar halinde gelebilir, bu y\u00fczden bir StringBuilder kullanmak en iyisidir.\n        currentValue.append(ch, start, length);\n    }\n\n    @Override\n    public void warning(SAXParseException e) throws SAXException {\n        System.err.println(\"UYARI: \" + e.getMessage());\n    }\n\n    @Override\n    public void error(SAXParseException e) throws SAXException {\n        System.err.println(\"HATA: \" + e.getMessage());\n        throw e; \/\/ Hatalar\u0131 yeniden f\u0131rlatarak ayr\u0131\u015ft\u0131rmay\u0131 durdurabiliriz\n    }\n\n    @Override\n    public void fatalError(SAXParseException e) throws SAXException {\n        System.err.println(\"KR\u0130T\u0130K HATA: \" + e.getMessage());\n        throw e; \/\/ Kritik hatalar\u0131 mutlaka yeniden f\u0131rlatmal\u0131y\u0131z\n    }\n}<\/code><\/pre>\n<p>Yukar\u0131daki <code>MySaxHandler<\/code> s\u0131n\u0131f\u0131, XML belgesindeki her elementin ba\u015flang\u0131c\u0131n\u0131, biti\u015fini ve metin i\u00e7eri\u011fini konsola yazd\u0131r\u0131r. <code>currentValue<\/code> <code>StringBuilder<\/code>&#8216;\u0131, <code>characters()<\/code> metodu taraf\u0131ndan gelen metin par\u00e7alar\u0131n\u0131 biriktirmek i\u00e7in kullan\u0131l\u0131r, \u00e7\u00fcnk\u00fc bir elementin metin i\u00e7eri\u011fi tek bir <code>characters()<\/code> \u00e7a\u011fr\u0131s\u0131nda gelmeyebilir. <code>startElement<\/code> ve <code>endElement<\/code> metotlar\u0131nda bu <code>StringBuilder<\/code>&#8216;\u0131 temizlemek \u00f6nemlidir. Ayr\u0131ca, hata y\u00f6netimi i\u00e7in <code>warning<\/code>, <code>error<\/code> ve <code>fatalError<\/code> metotlar\u0131 da ge\u00e7ersiz k\u0131l\u0131nm\u0131\u015ft\u0131r.<\/p>\n<h4>3. SAX Parser&#8217;\u0131 \u00c7al\u0131\u015ft\u0131rma<\/h4>\n<p>\u015eimdi ana uygulama s\u0131n\u0131f\u0131m\u0131z\u0131 olu\u015fturup SAX Parser&#8217;\u0131 ba\u015flatabiliriz:<\/p>\n<pre><code class=\"language-java\">\/\/ SaxParserExample.java\nimport javax.xml.parsers.SAXParser;\nimport javax.xml.parsers.SAXParserFactory;\nimport java.io.File;\n\npublic class SaxParserExample {\n    public static void main(String[] args) {\n        try {\n            \/\/ 1. SAXParserFactory \u00f6rne\u011fi olu\u015ftur\n            SAXParserFactory factory = SAXParserFactory.newInstance();\n\n            \/\/ 2. SAXParser \u00f6rne\u011fi olu\u015ftur\n            SAXParser saxParser = factory.newSAXParser();\n\n            \/\/ 3. Kendi ContentHandler uygulamam\u0131z\u0131 olu\u015ftur\n            MySaxHandler handler = new MySaxHandler();\n\n            \/\/ 4. XML belgesini ayr\u0131\u015ft\u0131r\n            \/\/ parse metodu bir File, InputStream, URL veya InputSource alabilir.\n            saxParser.parse(new File(\"kitaplar.xml\"), handler);\n\n        } catch (Exception e) {\n            e.printStackTrace();\n        }\n    }\n}<\/code><\/pre>\n<p>Bu kod par\u00e7as\u0131, <code>SAXParserFactory<\/code> kullanarak bir <code>SAXParser<\/code> olu\u015fturur. Ard\u0131ndan, daha \u00f6nce yazd\u0131\u011f\u0131m\u0131z <code>MySaxHandler<\/code> \u00f6rne\u011fini olu\u015fturur ve <code>saxParser.parse()<\/code> metoduna hem XML dosyas\u0131n\u0131 hem de i\u015fleyicimizi vererek ayr\u0131\u015ft\u0131rma i\u015flemini ba\u015flat\u0131r.<\/p>\n<p>Yukar\u0131daki kodu \u00e7al\u0131\u015ft\u0131rd\u0131\u011f\u0131n\u0131zda, <code>kitaplar.xml<\/code> dosyas\u0131n\u0131n i\u00e7eri\u011fine g\u00f6re <code>MySaxHandler<\/code> i\u00e7indeki metotlar \u00e7a\u011fr\u0131lacak ve konsolda olay ak\u0131\u015f\u0131n\u0131 g\u00f6receksiniz.<\/p>\n<h3>Kapsaml\u0131 Bir \u00d6rnek: Kitap Listesini Ayr\u0131\u015ft\u0131rma<\/h3>\n<p>\u015eimdi daha ger\u00e7ek\u00e7i bir senaryo ele alal\u0131m. Amac\u0131m\u0131z, <code>kitaplar.xml<\/code> dosyas\u0131ndaki kitap bilgilerini ayr\u0131\u015ft\u0131r\u0131p her bir kitab\u0131 bir Java nesnesine d\u00f6n\u00fc\u015ft\u00fcrmek ve bu nesneleri bir liste i\u00e7inde saklamakt\u0131r.<\/p>\n<h4>\u00d6rnek XML Yap\u0131s\u0131<\/h4>\n<p>Yukar\u0131daki <code>kitaplar.xml<\/code> dosyas\u0131n\u0131 kullanaca\u011f\u0131z.<\/p>\n<h4>Kitap S\u0131n\u0131f\u0131 Olu\u015fturma<\/h4>\n<p>Kitap bilgilerini tutmak i\u00e7in basit bir POJO (Plain Old Java Object) s\u0131n\u0131f\u0131 olu\u015ftural\u0131m:<\/p>\n<pre><code class=\"language-java\">\/\/ Kitap.java\npublic class Kitap {\n    private String id;\n    private String baslik;\n    private String yazar;\n    private int yil;\n    private double fiyat;\n    private String paraBirimi;\n\n    \/\/ Getter ve Setter metotlar\u0131\n    public String getId() { return id; }\n    public void setId(String id) { this.id = id; }\n    public String getBaslik() { return baslik; }\n    public void setBaslik(String baslik) { this.baslik = baslik; }\n    public String getYazar() { return yazar; }\n    public void setYazar(String yazar) { this.yazar = yazar; }\n    public int getYil() { return yil; }\n    public void setYil(int yil) { this.yil = yil; }\n    public double getFiyat() { return fiyat; }\n    public void setFiyat(double fiyat) { this.fiyat = fiyat; }\n    public String getParaBirimi() { return paraBirimi; }\n    public void setParaBirimi(String paraBirimi) { this.paraBirimi = paraBirimi; }\n\n    @Override\n    public String toString() {\n        return \"Kitap{\" +\n               \"id='\" + id + '\\'' +\n               \", baslik='\" + baslik + '\\'' +\n               \", yazar='\" + yazar + '\\'' +\n               \", yil=\" + yil +\n               \", fiyat=\" + fiyat +\n               \", paraBirimi='\" + paraBirimi + '\\'' +\n               '}';\n    }\n}<\/code><\/pre>\n<h4>\u00d6zel ContentHandler Uygulamas\u0131 (KitapSaxHandler)<\/h4>\n<p>\u015eimdi <code>DefaultHandler<\/code>&#8216;\u0131 geni\u015fleterek kitaplar\u0131 ayr\u0131\u015ft\u0131racak \u00f6zel bir i\u015fleyici yazal\u0131m. Bu i\u015fleyici, ayr\u0131\u015ft\u0131rma s\u0131ras\u0131nda bir <code>Kitap<\/code> nesnesi olu\u015fturacak ve element i\u00e7eriklerini yakalayarak bu nesnenin alanlar\u0131n\u0131 dolduracakt\u0131r.<\/p>\n<pre><code class=\"language-java\">\/\/ KitapSaxHandler.java\nimport org.xml.sax.Attributes;\nimport org.xml.sax.SAXException;\nimport org.xml.sax.helpers.DefaultHandler;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\npublic class KitapSaxHandler extends DefaultHandler {\n\n    private List<Kitap> kitaplar = new ArrayList<>();\n    private Kitap currentKitap;\n    private StringBuilder currentValue = new StringBuilder();\n\n    \/\/ Hangi elementin i\u00e7inde oldu\u011fumuzu takip etmek i\u00e7in bayraklar\n    private boolean isBaslik = false;\n    private boolean isYazar = false;\n    private boolean isYil = false;\n    private boolean isFiyat = false;\n\n    public List<Kitap> getKitaplar() {\n        return kitaplar;\n    }\n\n    @Override\n    public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {\n        currentValue.setLength(0); \/\/ Her yeni element ba\u015flad\u0131\u011f\u0131nda StringBuilder'\u0131 temizle\n\n        if (qName.equalsIgnoreCase(\"kitap\")) {\n            currentKitap = new Kitap();\n            String id = attributes.getValue(\"id\");\n            currentKitap.setId(id);\n        } else if (qName.equalsIgnoreCase(\"baslik\")) {\n            isBaslik = true;\n        } else if (qName.equalsIgnoreCase(\"yazar\")) {\n            isYazar = true;\n        } else if (qName.equalsIgnoreCase(\"yil\")) {\n            isYil = true;\n        } else if (qName.equalsIgnoreCase(\"fiyat\")) {\n            isFiyat = true;\n            String paraBirimi = attributes.getValue(\"paraBirimi\");\n            currentKitap.setParaBirimi(paraBirimi);\n        }\n    }\n\n    @Override\n    public void endElement(String uri, String localName, String qName) throws SAXException {\n        String elementContent = currentValue.toString().trim();\n\n        if (isBaslik) {\n            currentKitap.setBaslik(elementContent);\n            isBaslik = false;\n        } else if (isYazar) {\n            currentKitap.setYazar(elementContent);\n            isYazar = false;\n        } else if (isYil) {\n            currentKitap.setYil(Integer.parseInt(elementContent));\n            isYil = false;\n        } else if (isFiyat) {\n            currentKitap.setFiyat(Double.parseDouble(elementContent));\n            isFiyat = false;\n        } else if (qName.equalsIgnoreCase(\"kitap\")) {\n            kitaplar.add(currentKitap); \/\/ Kitap elementi bitti\u011finde Kitap nesnesini listeye ekle\n        }\n        currentValue.setLength(0); \/\/ Element bitti\u011finde StringBuilder'\u0131 temizle\n    }\n\n    @Override\n    public void characters(char[] ch, int start, int length) throws SAXException {\n        currentValue.append(ch, start, length);\n    }\n}<\/code><\/pre>\n<p><code>KitapSaxHandler<\/code> s\u0131n\u0131f\u0131nda:<br \/>\n*   <code>kitaplar<\/code> listesi, ayr\u0131\u015ft\u0131r\u0131lan <code>Kitap<\/code> nesnelerini tutar.<br \/>\n*   <code>currentKitap<\/code>, o an i\u015flenmekte olan <code>Kitap<\/code> nesnesidir.<br \/>\n*   <code>currentValue<\/code>, <code>characters()<\/code> metodu taraf\u0131ndan gelen metin verisini biriktirir.<br \/>\n*   <code>isBaslik<\/code>, <code>isYazar<\/code> gibi boolean bayraklar, <code>characters()<\/code> metodu \u00e7a\u011fr\u0131ld\u0131\u011f\u0131nda hangi elementin i\u00e7eri\u011fini i\u015fledi\u011fimizi anlamam\u0131z\u0131 sa\u011flar. SAX&#8217;\u0131n tek y\u00f6nl\u00fc ak\u0131\u015f yap\u0131s\u0131 nedeniyle, bu t\u00fcr durum y\u00f6netimi genellikle gereklidir.<br \/>\n*   <code>startElement<\/code> i\u00e7inde, <code><kitap><\/code> elementi ba\u015flad\u0131\u011f\u0131nda yeni bir <code>Kitap<\/code> nesnesi olu\u015fturulur ve <code>id<\/code> niteli\u011fi okunur. <code><fiyat><\/code> elementi ba\u015flad\u0131\u011f\u0131nda <code>paraBirimi<\/code> niteli\u011fi okunur. Di\u011fer elementler i\u00e7in ilgili bayraklar <code>true<\/code> yap\u0131l\u0131r.<br \/>\n*   <code>endElement<\/code> i\u00e7inde, bayraklara g\u00f6re <code>currentKitap<\/code> nesnesinin ilgili alanlar\u0131 doldurulur ve bayraklar <code>false<\/code> yap\u0131l\u0131r. <code><kitap><\/code> elementi bitti\u011finde, tamamlanm\u0131\u015f <code>currentKitap<\/code> nesnesi <code>kitaplar<\/code> listesine eklenir.<br \/>\n*   <code>characters<\/code> metodu, element i\u00e7eri\u011fini <code>currentValue<\/code> <code>StringBuilder<\/code>&#8216;\u0131na ekler.<\/p>\n<h4>Ana Uygulama S\u0131n\u0131f\u0131 (Main)<\/h4>\n<p>Son olarak, bu i\u015fleyiciyi kullanarak XML dosyas\u0131n\u0131 ayr\u0131\u015ft\u0131racak ve sonu\u00e7lar\u0131 ekrana yazd\u0131racak ana uygulamam\u0131z\u0131 olu\u015ftural\u0131m:<\/p>\n<pre><code class=\"language-java\">\/\/ Main.java\nimport javax.xml.parsers.SAXParser;\nimport javax.xml.parsers.SAXParserFactory;\nimport java.io.File;\nimport java.util.List;\n\npublic class Main {\n    public static void main(String[] args) {\n        try {\n            SAXParserFactory factory = SAXParserFactory.newInstance();\n            SAXParser saxParser = factory.newSAXParser();\n\n            KitapSaxHandler handler = new KitapSaxHandler();\n\n            \/\/ XML dosyas\u0131n\u0131 ayr\u0131\u015ft\u0131r\n            saxParser.parse(new File(\"kitaplar.xml\"), handler);\n\n            \/\/ Ayr\u0131\u015ft\u0131r\u0131lan kitaplar\u0131 al ve yazd\u0131r\n            List<Kitap> kitaplar = handler.getKitaplar();\n            System.out.println(\"\\n--- Ayr\u0131\u015ft\u0131r\u0131lan Kitaplar ---\");\n            for (Kitap kitap : kitaplar) {\n                System.out.println(kitap);\n            }\n\n        } catch (Exception e) {\n            e.printStackTrace();\n        }\n    }\n}<\/code><\/pre>\n<p>Bu <code>Main<\/code> s\u0131n\u0131f\u0131, <code>SAXParser<\/code>&#8216;\u0131 ba\u015flat\u0131r, <code>KitapSaxHandler<\/code>&#8216;\u0131 kullanarak <code>kitaplar.xml<\/code> dosyas\u0131n\u0131 ayr\u0131\u015ft\u0131r\u0131r ve ard\u0131ndan i\u015fleyici taraf\u0131ndan toplanan <code>Kitap<\/code> nesnelerini konsola yazd\u0131r\u0131r. Bu \u00f6rnek, SAX&#8217;\u0131n b\u00fcy\u00fck XML dosyalar\u0131ndan veri \u00e7ekmek i\u00e7in nas\u0131l kullan\u0131labilece\u011fini net bir \u015fekilde g\u00f6stermektedir.<\/p>\n<h3>Hata Y\u00f6netimi ve \u00d6zel Durumlar<\/h3>\n<p>SAX Parser, ayr\u0131\u015ft\u0131rma s\u0131ras\u0131nda olu\u015fabilecek hatalar\u0131 y\u00f6netmek i\u00e7in <code>org.xml.sax.ErrorHandler<\/code> aray\u00fcz\u00fcn\u00fc kullan\u0131r. <code>DefaultHandler<\/code> s\u0131n\u0131f\u0131 bu aray\u00fcz\u00fc de uygular ve varsay\u0131lan olarak hata metotlar\u0131 bo\u015f implementasyonlara sahiptir. Kendi hata y\u00f6netimi mant\u0131\u011f\u0131n\u0131z\u0131 eklemek i\u00e7in bu metotlar\u0131 ge\u00e7ersiz k\u0131labilirsiniz:<\/p>\n<p>*   <strong><code>warning(SAXParseException e)<\/code><\/strong>: XML belgesindeki iyi bi\u00e7imlilik (well-formedness) kurallar\u0131n\u0131 ihlal etmeyen, ancak istenmeyen durumlar\u0131 (\u00f6rn. DTD&#8217;de tan\u0131mlanmam\u0131\u015f bir varl\u0131k referans\u0131) bildirir. Ayr\u0131\u015ft\u0131rma devam eder.<br \/>\n*   <strong><code>error(SAXParseException e)<\/code><\/strong>: XML belgesinin iyi bi\u00e7imlilik kurallar\u0131n\u0131 ihlal eden ancak kritik olmayan hatalar\u0131 bildirir. Ayr\u0131\u015ft\u0131rma, hatan\u0131n ciddiyetine ba\u011fl\u0131 olarak devam edebilir veya durdurulabilir. Varsay\u0131lan implementasyon bir istisna f\u0131rlatmaz.<br \/>\n*   <strong><code>fatalError(SAXParseException e)<\/code><\/strong>: XML belgesinin iyi bi\u00e7imlilik kurallar\u0131n\u0131 ciddi \u015fekilde ihlal eden ve ayr\u0131\u015ft\u0131rman\u0131n devam etmesini imkans\u0131z k\u0131lan hatalar\u0131 bildirir. Bu durumda ayr\u0131\u015ft\u0131r\u0131c\u0131 durur. Varsay\u0131lan implementasyon bir <code>SAXException<\/code> f\u0131rlat\u0131r.<\/p>\n<p>Yukar\u0131daki <code>MySaxHandler<\/code> \u00f6rne\u011finde bu metotlar\u0131n basit bir implementasyonu bulunmaktad\u0131r. Ger\u00e7ek uygulamalarda, bu metotlar loglama, kullan\u0131c\u0131ya bildirim g\u00f6sterme veya uygulaman\u0131n durumuna g\u00f6re farkl\u0131 aksiyonlar alma gibi g\u00f6revler \u00fcstlenebilir.<\/p>\n<p>XML do\u011frulama (validation) da SAX ile yap\u0131labilir. E\u011fer XML belgesini bir DTD (Document Type Definition) veya XML \u015eemas\u0131na (XML Schema) g\u00f6re do\u011frulamak isterseniz, <code>SAXParserFactory<\/code> \u00fczerinde \u00f6zellikler ayarlaman\u0131z gerekir:<\/p>\n<pre><code class=\"language-java\">SAXParserFactory factory = SAXParserFactory.newInstance();\nfactory.setValidating(true); \/\/ Do\u011frulamay\u0131 etkinle\u015ftir\nfactory.setNamespaceAware(true); \/\/ Namespace deste\u011fini etkinle\u015ftir (genellikle \u00f6nerilir)\n\n\/\/ E\u011fer bir XML \u015femas\u0131na g\u00f6re do\u011frulamak istiyorsan\u0131z:\n\/\/ factory.setFeature(\"http:\/\/apache.org\/xml\/features\/validation\/schema\", true);\n\/\/ factory.setFeature(\"http:\/\/apache.org\/xml\/features\/validation\/schema-full-checking\", true);<\/code><\/pre>\n<p>Bu \u00f6zellikler ayarland\u0131\u011f\u0131nda, ayr\u0131\u015ft\u0131r\u0131c\u0131 XML belgesini belirtilen DTD veya \u015femaya g\u00f6re do\u011frular ve do\u011frulama hatalar\u0131n\u0131 <code>ErrorHandler<\/code> metotlar\u0131 arac\u0131l\u0131\u011f\u0131yla bildirir.<\/p>\n<h3>SAX Parser&#8217;\u0131n Avantajlar\u0131 ve Dezavantajlar\u0131<\/h3>\n<p>SAX Parser&#8217;\u0131n kullan\u0131m durumunu belirlemede avantaj ve dezavantajlar\u0131n\u0131 bilmek \u00f6nemlidir.<\/p>\n<h4>Avantajlar\u0131<\/h4>\n<p>*   <strong>D\u00fc\u015f\u00fck Bellek Kullan\u0131m\u0131:<\/strong> Belgeyi belle\u011fe y\u00fcklemedi\u011fi i\u00e7in \u00e7ok b\u00fcy\u00fck XML dosyalar\u0131n\u0131 bile etkili bir \u015fekilde i\u015fleyebilir. Bu, bellek k\u0131s\u0131tlamalar\u0131 olan sistemler veya \u00e7ok b\u00fcy\u00fck veri k\u00fcmeleri i\u00e7in kritik bir avantajd\u0131r.<br \/>\n*   <strong>Y\u00fcksek Performans:<\/strong> Tek ge\u00e7i\u015fli, ak\u0131\u015f tabanl\u0131 yap\u0131s\u0131 sayesinde h\u0131zl\u0131d\u0131r. Ayr\u0131\u015ft\u0131rma i\u015flemi, belgenin boyutuyla lineer olarak artar ve sabit bir bellek t\u00fcketimi sunar.<br \/>\n*   <strong>Anl\u0131k Veri \u0130\u015fleme:<\/strong> Veri ak\u0131\u015f\u0131 s\u0131ras\u0131nda olaylar tetiklendi\u011fi i\u00e7in, gelen veriyi an\u0131nda i\u015fleyebilir. Bu, ger\u00e7ek zamanl\u0131 veri i\u015fleme senaryolar\u0131nda faydal\u0131d\u0131r.<br \/>\n*   <strong>Basit API:<\/strong> Temel olay i\u015fleyicileri (<code>startElement<\/code>, <code>endElement<\/code>, <code>characters<\/code>) olduk\u00e7a basittir ve \u00f6\u011frenmesi kolayd\u0131r.<\/p>\n<h4>Dezavantajlar\u0131<\/h4>\n<p>*   <strong>Sadece \u0130leri Y\u00f6nl\u00fc (Read-Only):<\/strong> Belge \u00fczerinde ileri-geri gezinme veya rastgele eri\u015fim imkan\u0131 yoktur. Sadece ak\u0131\u015f\u0131n y\u00f6n\u00fcnde ilerleyebilirsiniz.<br \/>\n*   <strong>Belgeyi De\u011fi\u015ftirme Zorlu\u011fu:<\/strong> SAX, XML belgesini de\u011fi\u015ftirmek i\u00e7in uygun de\u011fildir. E\u011fer belgeyi manip\u00fcle etmeniz gerekiyorsa, DOM gibi bir \u00e7\u00f6z\u00fcm daha uygun olacakt\u0131r.<br \/>\n*   <strong>Durum Y\u00f6netimi Gereksinimi:<\/strong> Ayr\u0131\u015ft\u0131r\u0131lan veriyi bir ba\u011flam i\u00e7inde tutmak i\u00e7in (\u00f6rne\u011fin, hangi elementin i\u00e7inde oldu\u011fumuzu bilmek), \u00f6zel <code>ContentHandler<\/code> s\u0131n\u0131f\u0131n\u0131zda durum y\u00f6netimi (bayraklar, y\u0131\u011f\u0131nlar vb.) yapman\u0131z gerekebilir. Bu, karma\u015f\u0131k XML yap\u0131lar\u0131 i\u00e7in kodun daha karma\u015f\u0131k hale gelmesine neden olabilir.<br \/>\n*   <strong>Belge Yap\u0131s\u0131n\u0131 Bir B\u00fct\u00fcn Olarak G\u00f6rememe:<\/strong> Belgeyi bir b\u00fct\u00fcn olarak bellekte tutmad\u0131\u011f\u0131 i\u00e7in, bir elementin \u00fcst elementine veya karde\u015f elementlerine do\u011frudan eri\u015fmek m\u00fcmk\u00fcn de\u011fildir. Bu t\u00fcr ili\u015fkileri anlamak i\u00e7in kendi mant\u0131\u011f\u0131n\u0131z\u0131 geli\u015ftirmeniz gerekir.<br \/>\n*   <strong>Metin \u0130\u00e7eri\u011fi Par\u00e7al\u0131 Gelir:<\/strong> <code>characters()<\/code> metodu, bir elementin t\u00fcm metin i\u00e7eri\u011fini tek bir \u00e7a\u011fr\u0131da garanti etmez. Bu nedenle, metinleri bir <code>StringBuilder<\/code> i\u00e7inde biriktirmek genellikle gereklidir.<\/p>\n<h3>SAX ve Di\u011fer Ayr\u0131\u015ft\u0131r\u0131c\u0131lar Aras\u0131ndaki Se\u00e7im<\/h3>\n<p>Do\u011fru XML ayr\u0131\u015ft\u0131r\u0131c\u0131y\u0131 se\u00e7mek, uygulaman\u0131z\u0131n gereksinimlerine ba\u011fl\u0131d\u0131r:<\/p>\n<p>*   <strong>SAX&#8217;\u0131 Ne Zaman Se\u00e7meli?<\/strong><br \/>\n    *   \u00c7ok b\u00fcy\u00fck XML dosyalar\u0131n\u0131 ayr\u0131\u015ft\u0131r\u0131yorsan\u0131z ve bellek t\u00fcketimi bir endi\u015fe kayna\u011f\u0131ysa.<br \/>\n    *   XML belgesini sadece okuman\u0131z ve belirli verileri \u00e7\u0131karman\u0131z gerekiyorsa (yani belgeyi de\u011fi\u015ftirmeyecekseniz).<br \/>\n    *   Performans kritik bir fakt\u00f6rse.<br \/>\n    *   Veri ak\u0131\u015f\u0131 s\u0131ras\u0131nda anl\u0131k i\u015flem yapman\u0131z gerekiyorsa.<\/p>\n<p>*   <strong>DOM&#8217;u Ne Zaman Se\u00e7meli?<\/strong><br \/>\n    *   K\u00fc\u00e7\u00fck veya orta b\u00fcy\u00fckl\u00fckteki XML dosyalar\u0131n\u0131 i\u015fliyorsan\u0131z.<br \/>\n    *   XML belgesinin yap\u0131s\u0131nda ileri-geri gezinmeniz, elementleri araman\u0131z veya rastgele eri\u015fmeniz gerekiyorsa.<br \/>\n    *   XML belgesini de\u011fi\u015ftirecek, yeni elementler ekleyecek veya mevcutlar\u0131 silecekseniz.<br \/>\n    *   Bellek t\u00fcketimi b\u00fcy\u00fck bir sorun de\u011filse.<\/p>\n<p>*   <strong>StAX&#8217;\u0131 Ne Zaman Se\u00e7meli?<\/strong><br \/>\n    *   SAX&#8217;\u0131n d\u00fc\u015f\u00fck bellek ve performans avantajlar\u0131n\u0131 istiyor, ancak ayr\u0131\u015ft\u0131rma s\u00fcreci \u00fczerinde daha fazla kontrol (\u00e7ekme modeli) ar\u0131yorsan\u0131z.<br \/>\n    *   SAX&#8217;\u0131n olay tabanl\u0131 modelinin karma\u015f\u0131kl\u0131\u011f\u0131ndan ka\u00e7\u0131nmak istiyorsan\u0131z, ancak DOM&#8217;un bellek y\u00fck\u00fcn\u00fc de istemiyorsan\u0131z.<\/p>\n<p>*   <strong>JAXB&#8217;yi Ne Zaman Se\u00e7meli?<\/strong><br \/>\n    *   XML verilerini do\u011frudan Java nesnelerine e\u015flemek istiyorsan\u0131z.<br \/>\n    *   XML \u015femas\u0131na dayal\u0131 g\u00fc\u00e7l\u00fc tip denetimi ve otomatik kod \u00fcretimi avantajlar\u0131ndan yararlanmak istiyorsan\u0131z.<br \/>\n    *   Geli\u015ftirme h\u0131z\u0131n\u0131 art\u0131rmak ve XML ile Java nesneleri aras\u0131ndaki d\u00f6n\u00fc\u015f\u00fcm detaylar\u0131ndan soyutlanmak istiyorsan\u0131z.<\/p>\n<h3>Geli\u015fmi\u015f SAX \u00d6zellikleri<\/h3>\n<p>SAX, temel ayr\u0131\u015ft\u0131rman\u0131n \u00f6tesinde baz\u0131 geli\u015fmi\u015f \u00f6zellikler de sunar:<\/p>\n<p>*   <strong>Namespace Handling:<\/strong> XML namespace&#8217;leri, farkl\u0131 XML s\u00f6zl\u00fcklerinden gelen element ve nitelik adlar\u0131n\u0131n \u00e7ak\u0131\u015fmas\u0131n\u0131 \u00f6nlemek i\u00e7in kullan\u0131l\u0131r. SAX, <code>startElement<\/code> ve <code>endElement<\/code> metotlar\u0131nda namespace URI&#8217;si (<code>uri<\/code>) ve yerel ad\u0131 (<code>localName<\/code>) sa\u011flayarak namespace&#8217;leri destekler. <code>SAXParserFactory.setNamespaceAware(true)<\/code> ayar\u0131 ile namespace deste\u011fi etkinle\u015ftirilmelidir.<br \/>\n*   <strong>Entity Resolution (<code>EntityResolver<\/code>)<\/strong>: Harici DTD&#8217;ler veya genel varl\u0131klar gibi d\u0131\u015f kaynaklara yap\u0131lan referanslar\u0131 \u00e7\u00f6zmek i\u00e7in <code>EntityResolver<\/code> aray\u00fcz\u00fcn\u00fc kullanabilirsiniz. Bu, \u00f6zellikle \u00e7evrimd\u0131\u015f\u0131 \u00e7al\u0131\u015f\u0131rken veya harici kaynaklara eri\u015fimi kontrol etmeniz gerekti\u011finde faydal\u0131d\u0131r.<br \/>\n*   <strong>DTD ve XML \u015eema Do\u011frulamas\u0131 (Validation)<\/strong>: Daha \u00f6nce bahsedildi\u011fi gibi, <code>SAXParserFactory<\/code> \u00fczerinde <code>setValidating(true)<\/code> ve ilgili \u015fema \u00f6zelliklerini ayarlayarak XML belgesini bir DTD veya XML \u015eemas\u0131na g\u00f6re do\u011frulayabilirsiniz. Bu, gelen XML verisinin belirli bir yap\u0131ya uygunlu\u011funu sa\u011flamak i\u00e7in \u00f6nemlidir.<\/p>\n<h3>Sonu\u00e7<\/h3>\n<p>Java SAX Parser, XML belgelerini i\u015flemek i\u00e7in g\u00fc\u00e7l\u00fc, verimli ve hafif bir ara\u00e7t\u0131r. \u00d6zellikle b\u00fcy\u00fck XML dosyalar\u0131yla \u00e7al\u0131\u015f\u0131rken veya bellek k\u0131s\u0131tlamalar\u0131 olan ortamlarda SAX, di\u011fer ayr\u0131\u015ft\u0131rma y\u00f6ntemlerine g\u00f6re \u00f6nemli avantajlar sunar. Olay tabanl\u0131 yap\u0131s\u0131 sayesinde, XML belgesini belle\u011fe y\u00fcklemeden ak\u0131\u015f halinde i\u015fleyerek kaynak t\u00fcketimini minimumda tutar.<\/p>\n<p>Bu makalede, SAX&#8217;\u0131n temel mimarisi, kullan\u0131m ad\u0131mlar\u0131 ve kapsaml\u0131 bir \u00f6rnekle ger\u00e7ek d\u00fcnya senaryolar\u0131nda nas\u0131l uygulanabilece\u011fi detayl\u0131ca incelenmi\u015ftir. Hata y\u00f6netimi, di\u011fer ayr\u0131\u015ft\u0131r\u0131c\u0131larla kar\u015f\u0131la\u015ft\u0131rma ve geli\u015fmi\u015f \u00f6zellikler de ele al\u0131narak SAX&#8217;\u0131n t\u00fcm y\u00f6nleriyle anla\u015f\u0131lmas\u0131 hedeflenmi\u015ftir. Uygulaman\u0131z\u0131n gereksinimlerini dikkatlice de\u011ferlendirerek, XML veri i\u015fleme ihtiya\u00e7lar\u0131n\u0131z i\u00e7in en uygun ayr\u0131\u015ft\u0131r\u0131c\u0131y\u0131 se\u00e7mek, performans ve kaynak verimlili\u011fi a\u00e7\u0131s\u0131ndan kritik \u00f6neme sahiptir. SAX, do\u011fru kullan\u0131ld\u0131\u011f\u0131nda, Java uygulamalar\u0131n\u0131zda XML i\u015fleme yeteneklerini \u00f6nemli \u00f6l\u00e7\u00fcde art\u0131rabilir.<\/body><\/p>\n","protected":false},"excerpt":{"rendered":"Java SAX Parser ile XML Belge \u0130\u015fleme: Kapsaml\u0131 Bir Rehber\nGiri\u015f\nG\u00fcn\u00fcm\u00fcz\u00fcn yaz\u0131l\u0131m d\u00fcnyas\u0131nda veri de\u011fi\u015fimi, uygulamalar aras\u0131 ileti\u015fi","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"csco_page_header_type":"","csco_page_load_nextpost":"","csco_page_subscribe_form":"","csco_page_contact_form":"","footnotes":""},"categories":[1408],"tags":[],"class_list":{"0":"post-35368","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-java","7":"cs-entry","8":"cs-video-wrap"},"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.5 (Yoast SEO v25.3.1) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Java SAX Parser ile XML Belge \u0130\u015fleme: Kapsaml\u0131 Bir Rehber - Kodlar\u0131n Gizemli D\u00fcnyas\u0131<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/fatihsoysal.com\/blog\/java-sax-parser-ile-xml-belge-isleme-kapsamli-bir-rehber\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Java SAX Parser ile XML Belge \u0130\u015fleme: Kapsaml\u0131 Bir Rehber\" \/>\n<meta property=\"og:description\" content=\"Java SAX Parser ile XML Belge \u0130\u015fleme: Kapsaml\u0131 Bir Rehber Giri\u015f G\u00fcn\u00fcm\u00fcz\u00fcn yaz\u0131l\u0131m d\u00fcnyas\u0131nda veri de\u011fi\u015fimi, uygulamalar aras\u0131 ileti\u015fi\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/java-sax-parser-ile-xml-belge-isleme-kapsamli-bir-rehber\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2025-11-28T19:40:53+00:00\" \/>\n<meta name=\"author\" content=\"Fatih Soysal\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Yazan:\" \/>\n\t<meta name=\"twitter:data1\" content=\"Fatih Soysal\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tahmini okuma s\u00fcresi\" \/>\n\t<meta name=\"twitter:data2\" content=\"19 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/java-sax-parser-ile-xml-belge-isleme-kapsamli-bir-rehber\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/java-sax-parser-ile-xml-belge-isleme-kapsamli-bir-rehber\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"Java SAX Parser ile XML Belge \u0130\u015fleme: Kapsaml\u0131 Bir Rehber\",\"datePublished\":\"2025-11-28T19:40:53+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/java-sax-parser-ile-xml-belge-isleme-kapsamli-bir-rehber\/\"},\"wordCount\":2809,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"articleSection\":[\"Java\"],\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/java-sax-parser-ile-xml-belge-isleme-kapsamli-bir-rehber\/#respond\"]}],\"copyrightYear\":\"2025\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/java-sax-parser-ile-xml-belge-isleme-kapsamli-bir-rehber\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/java-sax-parser-ile-xml-belge-isleme-kapsamli-bir-rehber\/\",\"name\":\"Java SAX Parser ile XML Belge \u0130\u015fleme: Kapsaml\u0131 Bir Rehber - Kodlar\u0131n Gizemli D\u00fcnyas\u0131\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2025-11-28T19:40:53+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/java-sax-parser-ile-xml-belge-isleme-kapsamli-bir-rehber\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/java-sax-parser-ile-xml-belge-isleme-kapsamli-bir-rehber\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/java-sax-parser-ile-xml-belge-isleme-kapsamli-bir-rehber\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Java SAX Parser ile XML Belge \u0130\u015fleme: Kapsaml\u0131 Bir Rehber\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/\",\"name\":\"Fatihsoysal.com\",\"description\":\"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim\",\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"tr\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\",\"name\":\"Fatih Soysal\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"tr\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"contentUrl\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"width\":512,\"height\":512,\"caption\":\"Fatih Soysal\"},\"logo\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\"},\"description\":\"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Java SAX Parser ile XML Belge \u0130\u015fleme: Kapsaml\u0131 Bir Rehber - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/fatihsoysal.com\/blog\/java-sax-parser-ile-xml-belge-isleme-kapsamli-bir-rehber\/","og_locale":"tr_TR","og_type":"article","og_title":"Java SAX Parser ile XML Belge \u0130\u015fleme: Kapsaml\u0131 Bir Rehber","og_description":"Java SAX Parser ile XML Belge \u0130\u015fleme: Kapsaml\u0131 Bir Rehber Giri\u015f G\u00fcn\u00fcm\u00fcz\u00fcn yaz\u0131l\u0131m d\u00fcnyas\u0131nda veri de\u011fi\u015fimi, uygulamalar aras\u0131 ileti\u015fi","og_url":"https:\/\/fatihsoysal.com\/blog\/java-sax-parser-ile-xml-belge-isleme-kapsamli-bir-rehber\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2025-11-28T19:40:53+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"19 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/java-sax-parser-ile-xml-belge-isleme-kapsamli-bir-rehber\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/java-sax-parser-ile-xml-belge-isleme-kapsamli-bir-rehber\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"Java SAX Parser ile XML Belge \u0130\u015fleme: Kapsaml\u0131 Bir Rehber","datePublished":"2025-11-28T19:40:53+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/java-sax-parser-ile-xml-belge-isleme-kapsamli-bir-rehber\/"},"wordCount":2809,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"articleSection":["Java"],"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/java-sax-parser-ile-xml-belge-isleme-kapsamli-bir-rehber\/#respond"]}],"copyrightYear":"2025","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/java-sax-parser-ile-xml-belge-isleme-kapsamli-bir-rehber\/","url":"https:\/\/fatihsoysal.com\/blog\/java-sax-parser-ile-xml-belge-isleme-kapsamli-bir-rehber\/","name":"Java SAX Parser ile XML Belge \u0130\u015fleme: Kapsaml\u0131 Bir Rehber - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2025-11-28T19:40:53+00:00","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/java-sax-parser-ile-xml-belge-isleme-kapsamli-bir-rehber\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/java-sax-parser-ile-xml-belge-isleme-kapsamli-bir-rehber\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/java-sax-parser-ile-xml-belge-isleme-kapsamli-bir-rehber\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Java SAX Parser ile XML Belge \u0130\u015fleme: Kapsaml\u0131 Bir Rehber"}]},{"@type":"WebSite","@id":"https:\/\/fatihsoysal.com\/blog\/#website","url":"https:\/\/fatihsoysal.com\/blog\/","name":"Fatihsoysal.com","description":"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim","publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"tr"},{"@type":["Person","Organization"],"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1","name":"Fatih Soysal","image":{"@type":"ImageObject","inLanguage":"tr","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","contentUrl":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","width":512,"height":512,"caption":"Fatih Soysal"},"logo":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/"},"description":"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.","url":"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/"}]}},"yoast_meta":{"yoast_wpseo_title":"","yoast_wpseo_metadesc":"","yoast_wpseo_canonical":""},"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/35368","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/comments?post=35368"}],"version-history":[{"count":1,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/35368\/revisions"}],"predecessor-version":[{"id":35369,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/35368\/revisions\/35369"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=35368"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=35368"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=35368"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}