-
Notifications
You must be signed in to change notification settings - Fork 58
/
Copy pathxml-parse-into-struct.xml
307 lines (282 loc) · 7.75 KB
/
xml-parse-into-struct.xml
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
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
<?xml version="1.0" encoding="utf-8"?>
<!-- $Revision$ -->
<!-- EN-Revision: 886c5c639f2f33a01278d61c1d72ef39af880714 Maintainer: yago Status: ready -->
<refentry xmlns="http://docbook.org/ns/docbook" xml:id="function.xml-parse-into-struct">
<refnamediv>
<refname>xml_parse_into_struct</refname>
<refpurpose>Interpreta datos XML en una estructura de array</refpurpose>
</refnamediv>
<refsect1 role="description">
&reftitle.description;
<methodsynopsis>
<type>int</type><methodname>xml_parse_into_struct</methodname>
<methodparam><type>resource</type><parameter>parser</parameter></methodparam>
<methodparam><type>string</type><parameter>data</parameter></methodparam>
<methodparam><type>array</type><parameter role="reference">values</parameter></methodparam>
<methodparam choice="opt"><type>array</type><parameter role="reference">index</parameter></methodparam>
</methodsynopsis>
<para>
Esta función interpreta una cadena XML en dos estructuras paralelas de array, una
(<parameter>index</parameter>) que contiene punteros a la ubicación de los
valores adecuados en el array <parameter>values</parameter>. Estos dos últimos
parámetros deben ser pasados por referencia.
</para>
</refsect1>
<refsect1 role="parameters">
&reftitle.parameters;
<para>
<variablelist>
<varlistentry>
<term><parameter>parser</parameter></term>
<listitem>
<para>
Una referencia para el interprete de XML.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term><parameter>data</parameter></term>
<listitem>
<para>
Una cadena que contiene los datos XML.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term><parameter>values</parameter></term>
<listitem>
<para>
Un array que contiene los valores de los datos XML.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term><parameter>index</parameter></term>
<listitem>
<para>
Un array que contiene apuntadores hacia la ubicación de los valores apropiados en $values.
</para>
</listitem>
</varlistentry>
</variablelist>
</para>
</refsect1>
<refsect1 role="returnvalues">
&reftitle.returnvalues;
<para>
<function>xml_parse_into_struct</function> retorna 0 cuando falla y 1 si es
exitoso. Esto no es lo mismo que &false; y &true;, tener cuidado con
operadores tales como ===.
</para>
</refsect1>
<refsect1 role="examples">
&reftitle.examples;
<para>
A continuación se muestra un ejemplo que ilustra la estructura interna de
los arrays que se generan por la función. Se usa una etiqueta simple
<literal>note</literal> incrustada dentro de una etiqueta
<literal>para</literal> y entonces esto se interpreta y se muestran
las estructuras generadas:
<example>
<title>Ejemplo de <function>xml_parse_into_struct</function></title>
<programlisting role="php">
<![CDATA[
<?php
$simple = "<para><note>Nota Simple</note></para>";
$p = xml_parser_create();
xml_parse_into_struct($p, $simple, $vals, $index);
xml_parser_free($p);
echo "Index array\n";
print_r($index);
echo "\nVals array\n";
print_r($vals);
?>
]]>
</programlisting>
<para>
Cuando se ejecuta este código, la salida será:
</para>
<screen>
<![CDATA[
Index array
Array
(
[PARA] => Array
(
[0] => 0
[1] => 2
)
[NOTE] => Array
(
[0] => 1
)
)
Vals array
Array
(
[0] => Array
(
[tag] => PARA
[type] => open
[level] => 1
)
[1] => Array
(
[tag] => NOTE
[type] => complete
[level] => 2
[value] => simple note
)
[2] => Array
(
[tag] => PARA
[type] => close
[level] => 1
)
)
]]>
</screen>
</example>
</para>
<para>
El análisis por eventos (basado en la biblioteca expat) puede ser más
complicado cuando se tiene un documento XML que es complejo.
Esta función no produce un objeto de estilo DOM, pero
genera estructuras susceptibles de ser transversionadas en forma
de árbol. Por lo tanto, se pueden crear objetos que representan los datos
en el archivo XML con facilidad. Considere el siguiente archivo XML
que representa una pequeña base de datos con información de aminoácidos:
<example>
<title>moldb.xml - pequeña base de datos de información molecular</title>
<programlisting role="xml">
<![CDATA[
<?xml version="1.0"?>
<moldb>
<molecule>
<name>Alanine</name>
<symbol>ala</symbol>
<code>A</code>
<type>hydrophobic</type>
</molecule>
<molecule>
<name>Lysine</name>
<symbol>lys</symbol>
<code>K</code>
<type>charged</type>
</molecule>
</moldb>
]]>
</programlisting>
</example>
Y algo de código para interpretar el documento y generar los objetos
adecuados:
<example>
<title>
parsemoldb.php - interpreta moldb.xml dentro de un array de
objetos moleculares
</title>
<programlisting role="php">
<![CDATA[
<?php
class AminoAcid {
var $name; // nombre aa
var $symbol; // símbolo de tres letras
var $code; // código de una letra
var $type; // hidrofóbico, cargado or neutral
function AminoAcid ($aa)
{
foreach ($aa as $k=>$v)
$this->$k = $aa[$k];
}
}
function readDatabase($filename)
{
// read the XML database of aminoacids
$data = implode("", file($filename));
$parser = xml_parser_create();
xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, 0);
xml_parser_set_option($parser, XML_OPTION_SKIP_WHITE, 1);
xml_parse_into_struct($parser, $data, $values, $tags);
xml_parser_free($parser);
// repetir a través de las extructuras
foreach ($tags as $key=>$val) {
if ($key == "molecule") {
$molranges = $val;
// cada par contiguo de netradas de array son los
// rangos altos y bajos para cada definición de molécula
for ($i=0; $i < count($molranges); $i+=2) {
$offset = $molranges[$i] + 1;
$len = $molranges[$i + 1] - $offset;
$tdb[] = parseMol(array_slice($values, $offset, $len));
}
} else {
continue;
}
}
return $tdb;
}
function parseMol($mvalues)
{
for ($i=0; $i < count($mvalues); $i++) {
$mol[$mvalues[$i]["tag"]] = $mvalues[$i]["value"];
}
return new AminoAcid($mol);
}
$db = readDatabase("moldb.xml");
echo "** Database of AminoAcid objects:\n";
print_r($db);
?>
]]>
</programlisting>
</example>
Después de ejecutar <filename>parsemoldb.php</filename>, la variable
<varname>$db</varname> contiene un array de
objetos de <classname>AminoAcid</classname> y la salida del
script confirma que:
<informalexample>
<screen>
<![CDATA[
** Base de datos de objetos AminoÁcidos:
Array
(
[0] => Objeto aminoácido
(
[name] => Alanine
[symbol] => ala
[code] => A
[type] => hydrophobic
)
[1] => Objeto aminoácido
(
[name] => Lysine
[symbol] => lys
[code] => K
[type] => charged
)
)
]]>
</screen>
</informalexample>
</para>
</refsect1>
</refentry>
<!-- Keep this comment at the end of the file
Local variables:
mode: sgml
sgml-omittag:t
sgml-shorttag:t
sgml-minimize-attributes:nil
sgml-always-quote-attributes:t
sgml-indent-step:1
sgml-indent-data:t
indent-tabs-mode:nil
sgml-parent-document:nil
sgml-default-dtd-file:"~/.phpdoc/manual.ced"
sgml-exposed-tags:nil
sgml-local-catalogs:nil
sgml-local-ecat-files:nil
End:
vim600: syn=xml fen fdm=syntax fdl=2 si
vim: et tw=78 syn=sgml
vi: ts=1 sw=1
-->