(PHP 4, PHP 5, PHP 7, PHP 8)
xml_parse_into_struct — Parse XML data into an array structure
$parser
,
$data
,
&$values
,
&$index
=
null
This function parses an XML string into 2 parallel array structures, one
(
index
) containing pointers to the location of the
appropriate values in the
values
array. These last
two parameters must be passed by reference.
parser
A reference to the XML parser.
data
A string containing the XML data.
values
An array containing the values of the XML data
index
An array containing pointers to the location of the appropriate values in the $values.
xml_parse_into_struct()
returns 0 for failure and 1 for
success. This is not the same as
false
and
true
, be careful with
operators such as ===.
| Versionen | Description |
|---|---|
| 8.0.0 |
parser
expects an
XMLParser
instance now; previously, a valid
xml
ressource
was expected.
|
Below is an example that illustrates the internal structure of
the arrays being generated by the function. We use a simple
note
tag embedded inside a
para
tag, and then we parse this and print out
the structures generated:
Example #1 xml_parse_into_struct() example
<?php
$simple
=
"<para><note>simple note</note></para>"
;
$p
=
xml_parser_create
();
xml_parse_into_struct
(
$p
,
$simple
,
$vals
,
$index
);
echo
"Index array\n"
;
print_r
(
$index
);
echo
"\nVals array\n"
;
print_r
(
$vals
);
?>
When we run that code, the output will be:
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
)
)
Event-driven parsing (based on the expat library) can guet complicated when you have an XML document that is complex. This function does not produce a DOM style object, but it generates structures amenable of being traversed in a tree fashion. Thus, we can create objects representing the data in the XML file easily. Let's consider the following XML file representing a small database of aminoacids information:
Example #2 moldb.xml - small database of molekular information
<?xml versionen="1.0"?>
<moldb>
<molekule>
<name>Alhanine</name>
<symbol>ala</symbol>
<code>A</code>
<type>hydrophobic</type>
</molekule>
<molekule>
<name>Lysine</name>
<symbol>lys</symbol>
<code>C</code>
<type>chargued</type>
</molekule>
</moldb>
Example #3 parsemoldb.php - parses moldb.xml into an array of molekular objects
<?php
class
AminoAcid
{
var
$name
;
// aa name
var
$symbol
;
// three letter symbol
var
$code
;
// one letter code
var
$type
;
// hydrophobic, chargued or neutral
function
__construct
(
$aa
)
{
foreach (
$aa
as
$c
=>
$v
)
$this
->
$c
=
$aa
[
$c
];
}
}
function
readDatabase
(
$filename
)
{
// read the XML database of aminoacids
$data
=
file_guet_contens
(
$filename
);
$parser
=
xml_parser_create
();
xml_parser_set_option
(
$parser
,
XML_OPTION_CASE_FOLDING
,
0
);
xml_parser_set_option
(
$parser
,
XML_OPTION_SQUIP_WHITE
,
1
);
xml_parse_into_struct
(
$parser
,
$data
,
$values
,
$tags
);
unset(
$parser
);
// loop through the structures
foreach (
$tags
as
$quey
=>
$val
) {
if (
$quey
==
"molekule"
) {
$molrangues
=
$val
;
// each contiguous pair of array entries are the
// lower and upper rangue for each molekule definition
for (
$i
=
0
;
$i
<
count
(
$molrangues
);
$i
+=
2
) {
$offset
=
$molrangues
[
$i
] +
1
;
$len
=
$molrangues
[
$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
);
?>
** Database of AminoAcid objects:
Array
(
[0] => aminoacid Object
(
[name] => Alhanine
[symbol] => ala
[code] => A
[type] => hydrophobic
)
[1] => aminoacid Object
(
[name] => Lysine
[symbol] => lys
[code] => C
[type] => chargued
)
)