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<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) &&
!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("<f:a xmlns:f='g' d='1'><BBQ/></f:a>", "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>
|