1
0
mirror of https://github.com/php/doc-it.git synced 2026-03-27 00:52:07 +01:00
Files
archived-doc-it/reference/xml/functions/xml-parse-into-struct.xml
Andrioli Darvin da2c52eba9 Sync to En tree
git-svn-id: https://svn.php.net/repository/phpdoc/it/trunk@117937 c90b9560-bf6c-de11-be94-00142212c4b1
2003-02-24 20:52:41 +00:00

246 lines
6.5 KiB
XML

<?xml version="1.0" encoding="iso-8859-1"?>
<!-- EN-Revision: 1.4 Maintainer: darvina Status: ready -->
<!-- splitted from ./en/functions/xml.xml, last change in rev 1.11 -->
<refentry id="function.xml-parse-into-struct">
<refnamediv>
<refname>xml_parse_into_struct</refname>
<refpurpose>Analisi di dati XML in una struttura a matrice</refpurpose>
</refnamediv>
<refsect1>
<title>Descrizione</title>
<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>&amp;valori</parameter></methodparam>
<methodparam choice="opt"><type>array</type><parameter>&amp;indice</parameter></methodparam>
</methodsynopsis>
<para>
Questa funzione registra un file XML in 2 strutture a
matrice, una (<parameter>indice</parameter>) contiene i puntatori
alla posizione dei valori nella matrice
<parameter>valori</parameter>. Questi due parametri devono essere
passati per riferimento.
</para>
<para>
Nell'esempio seguente si illustra la struttura interna delle matrici
generata dalla funzione. Qui si userà una semplice struttura con il
tag <literal>note</literal> inserito all'interno del tag
<literal>para</literal>, e quindi si analizzerà questo visualizzando
la struttura ottenuta:
<informalexample>
<programlisting role="php">
<![CDATA[
$simple = "<para><note>simple note</note></para>";
$p = xml_parser_create();
xml_parse_into_struct($p,$simple,$vals,$index);
xml_parser_free($p);
echo "Array indice\n";
print_r($index);
echo "\narray dei valori\n";
print_r($vals);
]]>
</programlisting>
</informalexample>
Eseguendo questo codice si otterrà:
<informalexample>
<screen>
<![CDATA[
Array indice
Array
(
[PARA] => Array
(
[0] => 0
[1] => 2
)
[NOTE] => Array
(
[0] => 1
)
)
Array dei valori
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>
</informalexample>
</para>
<para>
Un parsing event-driven (basato sulla libreria expat) può essere
molto complicato se si deve trattare un documento XML complesso.
Questa funzione non produce un oggetto in stile DOM, ma
genera una struttura che permette di essere gestita a modo di
albero. Quindi si può facilmente creare oggetti rappresentanti i dati
del file XML. Si consideri il seguente file XML rappresentante
un piccolo database di informazioni sugli aminoacidi.
<example>
<title>moldb.xml - piccolo database di informazioni sulle molecole</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>
Un codice per analizzare il documento e generare gli oggetti
appropriati:
<example>
<title>
parsemoldb.php - analizza moldb.xml e genera una matrice
di oggetti molecole
</title>
<programlisting role="php">
<![CDATA[
<?php
class AminoAcid {
var $name; // aa nome
var $symbol; // simbolo di tre lettere
var $code; // codice di una lettera
var $type; // hydrophobic, charged or neutral
function AminoAcid ($aa) {
foreach ($aa as $k=>$v)
$this->$k = $aa[$k];
}
}
function readDatabase($filename) {
// legge il database degli aminoacidi
$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);
// loop attraverso la struttura
foreach ($tags as $key=>$val) {
if ($key == "molecule") {
$molranges = $val;
// ciascuna coppia di elementi della matrice contigui
// sono il limite inferiore e superiore per la definizione di ciascuna molecola
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 di oggetti Aminoacidi:\n";
print_r($db);
?>
]]>
</programlisting>
</example>
Dopo l'esecuzione di <filename>parsemoldb.php</filename>, la variabile
<varname>$db</varname> contiene una matrice di oggetti
<classname>AminoAcid</classname>, e ciò viene confermato
dall'output dello script:
<informalexample>
<screen>
<![CDATA[
** Database di oggetti Aminoacidi:
Array
(
[0] => aminoacid Object
(
[name] => Alanine
[symbol] => ala
[code] => A
[type] => hydrophobic
)
[1] => aminoacid Object
(
[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:"../../../../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
-->