doc/us/examples.html

1
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
2
   "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
3
<html>
4
<head>
5
	<title>LuaExpat: XML Expat parsing for the Lua programming language</title>
6
    <link rel="stylesheet" href="../doc.css" type="text/css"/>
7
	<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
8
</head>
9
<body>
10
 
11
<div id="container">
12
	
13
<div id="product">
14
	<div id="product_logo"><a href="http://www.keplerproject.org">
15
        <img alt="LuaExpat logo" src="luaexpat.png"/>
16
	</a></div>
17
	<div id="product_name"><big><strong>LuaExpat</strong></big></div>
18
	<div id="product_description">XML Expat parsing for the Lua programming language</div>
19
</div> <!-- id="product" -->
20
 
21
<div id="main">
22
 
23
<div id="navigation">
24
<h1>LuaExpat</h1>
25
	<ul>
26
		<li><a href="index.html">Home</a>
27
			<ul>
28
				<li><a href="index.html#overview">Overview</a></li>
29
				<li><a href="index.html#status">Status</a></li>
30
				<li><a href="index.html#download">Download</a></li>
31
				<li><a href="index.html#history">History</a></li>
32
				<li><a href="index.html#references">References</a></li>
33
				<li><a href="index.html#credits">Credits</a></li>
34
				<li><a href="index.html#contact">Contact</a></li>
35
			</ul>
36
		</li>
37
		<li><a href="manual.html">Manual</a>
38
			<ul>
39
				<li><a href="manual.html#introduction">Introduction</a></li>
40
				<li><a href="manual.html#installation">Installation</a></li>
41
				<li><a href="manual.html#parser">Parser Objects</a></li>
42
			</ul>
43
		</li>
44
		<li><strong>Examples</strong></li>
45
		<li><a href="lom.html">Lua Object Model</a></li>
46
        <li><a href="http://luaforge.net/projects/luaexpat/">Project</a>
47
            <ul>
48
                <li><a href="http://luaforge.net/tracker/?group_id=13">Bug Tracker</a></li>
49
                <li><a href="http://luaforge.net/scm/?group_id=13">CVS</a></li>
50
            </ul>
51
        </li>
52
		<li><a href="license.html">License</a></li>
53
	</ul>
54
</div> <!-- id="navigation" -->
55
 
56
<div id="content">
57
 
58
<h2><a name="examples"></a>Examples</h2>
59
 
60
<p>The code excerpt below creates a parser with 2 callbacks and
61
feeds a test string to it. The parsing of the test string triggers
62
the callbacks, printing the results.</p>
63
 
64
<pre class="example">
65
require"lxp"
66
 
67
local count = 0
68
callbacks = {
69
    StartElement = function (parser, name)
70
        io.write("+ ", string.rep(" ", count), name, "\n")
71
        count = count + 1
72
    end,
73
    EndElement = function (parser, name)
74
        count = count - 1
75
        io.write("- ", string.rep(" ", count), name, "\n")
76
    end
77
}
78
 
79
p = lxp.new(callbacks)
80
 
81
for l in io.lines() do  -- iterate lines
82
    p:parse(l)          -- parses the line
83
    p:parse("\n")       -- parses the end of line
84
end
85
p:parse()               -- finishes the document
86
p:close()               -- closes the parser
87
</pre>
88
 
89
<p>For a test string like</p>
90
 
91
<pre class="example">
92
&lt;elem1&gt;
93
    text
94
    &lt;elem2/&gt;
95
    more text
96
&lt;/elem1&gt;
97
</pre>
98
 
99
<p>The example would print</p>
100
 
101
<pre class="example">
102
+ elem1
103
    + elem2
104
    - elem2
105
- elem1
106
</pre>
107
 
108
<p>Note that the text parts are not handled since the corresponding
109
callback (<em>CharacterData</em>) has not been defined. Also note
110
that defining this callback after the call to lxp.new would make no
111
difference. But had the callback table been defined as</p>
112
 
113
<pre class="example">
114
callbacks = {
115
    StartElement = function (parser, name)
116
        io.write("+ ", string.rep(" ", count), name, "\n")
117
        count = count + 1
118
    end,
119
    EndElement = function (parser, name)
120
        count = count - 1
121
        io.write("- ", string.rep(" ", count), name, "\n")
122
    end,
123
    CharacterData = function (parser, string)
124
        io.write("* ", string.rep(" ", count), string, "\n")
125
    end
126
}
127
</pre>
128
 
129
<p>The results would have been</p>
130
 
131
<pre class="example">
132
+ elem1
133
* text
134
    + elem2
135
    - elem2
136
* more text
137
- elem1
138
</pre>
139
 
140
<p>Another example would be the use of <em>false</em> as a
141
placeholder for the callback. Suppose that we would like to print
142
only the text associated with <em>elem2</em> elements and that the
143
XML sample is</p>
144
 
145
<pre class="example">
146
 &lt;elem1&gt;
147
    text
148
    &lt;elem2&gt;
149
        inside text
150
    &lt;/elem2&gt;
151
    more text
152
&lt;/elem1&gt;
153
</pre>
154
 
155
<p>We could define the new callback table as</p>
156
 
157
<pre class="example">
158
callbacks = {
159
    StartElement = function (parser, name)
160
      if name == "elem2" then
161
        -- redefines CharacterData behaviour
162
        callbacks.CharacterData = function (parser, string)
163
          io.write(string, "\n")
164
        end
165
      end
166
    end,
167
 
168
    EndElement = function (parser, name)
169
      if name == "elem2" then
170
        callbacks.CharacterData = false -- restores placeholder
171
      end
172
    end,
173
 
174
    CharacterData = false               -- placeholder
175
}
176
</pre>
177
 
178
<p>The results would have been</p>
179
 
180
<pre class="example">
181
inside text
182
</pre>
183
 
184
<p>Note that this example assumes no other elements are present
185
inside elem2 tags.</p>
186
 
187
</div> <!-- id="content" -->
188
 
189
</div> <!-- id="main" -->
190
 
191
</div> <!-- id="container" -->
192
 
193
</body>
194
</html>