10 Mart 2015 Salı

XML ve SAX

Not : XML ve DOM başlıklı yazıya göz atabilirsiniz.

Giriş

SAX Parser'lar sadece ileri doğru (forward-only) ilerlerler. Parser bir tag ile karşılaştıkça handler nesnesini çağırır. DOM Parser'lara göre SAX Parser'lar daha az bellek harcadıkları için büyük XML'leri okumak için kullanılabilirler.

Java
SAX Parser resimdeki sınıfları kullanır.
SAX Parser
SaxParser sınıfı
SaxParser büyük XML dosyalarını okumak için DOM'a göre daha avantajlı. Nasıl DocumentBuilderFactory bir DocumentBuilder yaratıyorsa SaxParserFactory'de bir SAXParser yaratıyor.


SAXParser parser = SAXParserFactory.newInstance().newSAXParser();
DefaultHandler handler = new MyHandler();
parser.parse("file.xml", handler);
MyHandler sınıfı DefaultHandler'dan kalıtan bir sınıf
class MyHandler extends DefaultHandler {

    @Override
    public void startDocument() throws SAXException {
    }

    @Override
    public void endDocument() throws SAXException {
    }

    @Override
    public void startElement(String uri, String localName, String qName,
            Attributes attributes) throws SAXException {
    }

    @Override
    public void endElement(String uri, String localName, String qName)
            throws SAXException {
    }

    // To take specific actions for each chunk of character data (such as
    // adding the data to a node or buffer, or printing it to a file).
    @Override
    public void characters(char ch[], int start, int length)
            throws SAXException {
    }

}

DefaultHandler sınıfı
SaxParser sınıfının okuduğu her tag DefaultHandler sınıftan türeyen bir başka sınıfa gönderiliyor.
characters
Bu metod ile tag içindeki veriye karakter karakter erişme imkanı var.

<lastname>deneme</lastname> içindeki deneme metni  

new String (ch,start,start+length) şeklinde alınabilir.

 Örnek'te ise metin karakter karakter aranıyor

C#
C#'ta kullanılan önemli sınıflar XMLReader ve XMLWriter

XmlReader sınıfı
Bu sınıf klasik bir SAX Parser değildir! Ancak SAX Parser'a çok benzediği için bu yazıya dahil ediyorum. Sınıf ileri doğru çalışır. SAX Parser'dan farklı olarak tag'ler ile karşılaştıkça bir handler'ı çağırmak yerine, programcının kendisini çağırmasını bekler.

MoveToContent metodu
Reader'ın önündeki XMLDeclaration, Comment gibi şeyleri atlamasını sağlar. Read metodunu çağırarak atlamaktan daha hızlıdır.
Örnek:
using (XmlReader reader = XmlReader.Create(new StringReader(myXmlAsString)))
{
    reader.MoveToContent(); // get the root-element
}

Read Metodu
Örnek:
static IEnumerable<XElement> SimpleStreamAxis(string inputUrl,
                                              string elementName)
{
  using (XmlReader reader = XmlReader.Create(inputUrl))
  {
    reader.MoveToContent();
    while (reader.Read())
    {
      if (reader.NodeType == XmlNodeType.Element)
      {
        if (reader.Name == elementName)
        {
          XElement el = XNode.ReadFrom(reader) as XElement;
          if (el != null)
          {
            yield return el;
          }
        }
      }
    }
  }
}



Hiç yorum yok:

Yorum Gönder