aboutsummaryrefslogtreecommitdiff
path: root/files/pl/sax/index.html
blob: ec8b53ed2fbb7a9316a9b09b61efea383857b241 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
---
title: SAX
slug: SAX
tags:
  - Dodatki
  - Rozszerzenia
  - Wszystkie_kategorie
translation_of: Archive/SAX
---
<p>
</p><p><b>SAX</b>, skrót dla <i>Simple API for XML</i>, jest parserem API. Po raz pierwszy SAX został szeroko zadoptowany w API dla XML w Javie i później został zaimplementowany w kilku innych środowiskach programowania. Wraz z <a href="pl/Firefox_2">Firefoksem 2</a>, parser SAX jest dostępny w aplikacjach XUL i rozszerzeniach. Aby zdobyć dodatkowe informacje, odwiedź <a class="external" href="http://www.saxproject.org/">stronę domową SAX</a>.
</p>
<h3 id="Szybki_start"> Szybki start </h3>
<p>Funkcjonalność parsera SAX jest dostępna poprzez interfejs <i>XML reader component</i>. Aby go utworzyć, zastosuj poniższy kod:
</p>
<pre class="eval">var xmlReader = Components.classes["@mozilla.org/saxparser/xmlreader;1"]
                          .createInstance(Components.interfaces.nsISAXXMLReader);
</pre>
<p>Po utworzeniu parsera SAX, będzie potrzebne ustawienie podprogramów obsługi dla zdarzeń, którymi jesteśmy zainteresowani <b>and fire off the parsing process</b>. Cała funkcjonalnośc jest dostępna poprzez interfejs <a href="https://dxr.mozilla.org/mozilla-central/source/parser/xml/public/nsISAXXMLReader.idl" rel="custom">nsISAXXMLReader</a>.
</p>
<h4 id="Ustawienie_obiektów_obsługi"> Ustawienie obiektów obsługi </h4>
<p>Obiekty obsługi (określone przez użytkownika) są zdefiniowanymi obiektami zaimplementowanymi w programie obsługi interfejsu SAX, które są zależne od rodzaju informacji, jaki chcemy otrzymać z parsera. Po rozpoczęciu procesu parsowania, obiekty obsługi przyjmują szereg wywołań zwrotnych dla treści XML, która jest parsowana. Dostępne są następujące obiekty obsługi: </p>
<table class="fullwidth-table">
<tbody><tr> <th>Interfejs</th> <th>Zastosowanie</th>
</tr>
<tr> <td><a href="https://dxr.mozilla.org/mozilla-central/source/parser/xml/public/nsISAXContentHandler.idl" rel="custom">nsISAXContentHandler</a></td> <td>Pakiet obiektu obsługuje zawartość logiczną dokumentu (np. elementy, atrybuty, białe znaki oraz instrukcje przetwarzania).</td>
</tr>
<tr> <td><a href="https://dxr.mozilla.org/mozilla-central/source/parser/xml/public/nsISAXDTDHandler.idl" rel="custom">nsISAXDTDHandler</a></td> <td>Pakiet obiektu obsługuje proste podobne do DTD zdarzenia.</td>
</tr>
<tr> <td><a href="https://dxr.mozilla.org/mozilla-central/source/parser/xml/public/nsISAXErrorHandler.idl" rel="custom">nsISAXErrorHandler</a></td> <td>Pakiet obsługi błędów strumienia wejściowego.</td>
</tr>
<tr> <td><a href="https://dxr.mozilla.org/mozilla-central/source/parser/xml/public/nsISAXLexicalHandler.idl" rel="custom">nsISAXLexicalHandler</a></td> <td>Rozszerzenie obiektu SAX2 dla zdarzeń struktur leksykalnych (np. komentarzy i sekcji CDATA, deklaracji DTD oraz encji).</td>
</tr>
</tbody></table>
<p>Przykład implementacji najczęściej stosowanych obiektów obsługi:
</p>
<pre>function print(s) {
  dump(s + "\n");
}

xmlReader.contentHandler = {
  // nsISAXContentHandler
  startDocument: function() {
    print("startDocument");
  },

  endDocument: function() {
    print("endDocument");
  },

  startElement: function(uri, localName, qName, /*nsISAXAttributes*/ attributes) {
    var attrs = [];
    for(var i=0; i&lt;attributes.length; i++) {
      attrs.push(attributes.getQName(i) + "='" +
                 attributes.getValue(i) + "'");
    }

    print("startElement: namespace='" + uri + "', localName='" +
          localName + "', qName='" + qName + "', attributes={" +
          attrs.join(",") + "}");
  },

  endElement: function(uri, localName, qName) {
    print("endElement: namespace='" + uri + "', localName='" +
          localName + "', qName='" + qName + "'");
  },

  characters: function(value) {
    print("characters: " + value);
  },

  processingInstruction: function(target, data) {
    print("processingInstruction: target='" + target + "', data='" +
          data + "'");
  },

  ignorableWhitespace: function(whitespace) {
    // don't care
  },

  startPrefixMapping: function(prefix, uri) {
    // don't care
  },

  endPrefixMapping: function(prefix) {
    // don't care
  },

  // nsISupports
  QueryInterface: function(iid) {
    if(!iid.equals(Components.interfaces.nsISupports) &amp;&amp;
       !iid.equals(Components.interfaces.nsISAXContentHandler))
      throw Components.results.NS_ERROR_NO_INTERFACE;
    return this;
  }
};
</pre>
<h4 id="Rozpoczęcie_parsowania"> Rozpoczęcie parsowania </h4>
<p><i>XML Reader component</i> potrafi parsować XML z łańcucha znakowego, <a href="pl/NsIInputStream">nsIInputStream</a> lub asynchronicznie przez interfejs <a href="pl/NsIStreamListener">nsIStreamListener</a>. Poniżej znajduje się przykład parsowania z łańcucha znakowego: </p>
<pre class="eval">xmlReader.parseFromString("&lt;f:a xmlns:f='g' d='1'&gt;&lt;BBQ/&gt;&lt;/f:a&gt;", "text/xml");
</pre>
<p>Wywoła to następującym rezultat na wyjściu (biorąc na siebie zawartość obiektu obsługi stosując przykład powyżej):
</p>
<pre>startDocument
startElement: namespace='g', localName='a', qName='f:a', attributes={d='1'}
startElement: namespace='', localName='BBQ', qName='BBQ', attributes={}
endElement: namespace='', localName='BBQ', qName='BBQ'
endElement: namespace='g', localName='a', qName='f:a'
endDocument
</pre>