Newsgroup: it.comp.www.php
Titolo: parse XML e velocità

Ciao, una domanda di benchmark.
Volevo sapere come utilizzare le funzioni parser XML di PHP.
Mi spiego meglio: un file XML può chiaramente essere strutturato in
vari modi.
Partendo da questa considerazione, e aggiungendo a questo il fatto che
dal mio XML dovrò poi generare in un secondo momento un array
associativo, come è meglio strutturare il file per guadagnare
velocità?
E' meglio ad esempio qualcosa come:
<molecule>
        <name>Alanine</name>
        <symbol>ala</symbol>
        <code>A</code>
        <type>hydrophobic</type>
</molecule>
Oppure semmai:
<molecule name='Alanine' symbol='ala' code='A' type='hydrophobic' />
Grazie a chiunque possa fornirmi indicazioni e buon anno a tutti.

 Grazie a chiunque possa fornirmi indicazioni e buon anno a tutti.
Andrea

 velocità?
fermo restando le considerazioni di andrea, che versione usi di php?
l'accesso deve essere solo in lettura o anche in scrittura? e in
scrittura solo per sovrascrivere nodi gia' esistenti o anche per
aggiungerne?
a seconda delle risposte a queste domande dovrai usare un'estensione
piuttosto che un'altra, e di conseguenza avrai accesso o meno alla
struttura dell'xml nella sua interezza

Dunque, NO:
assolutamente NON devono generare una pagina HTML.
I dati, scritti direttamente in un file XML (dal quale leggono altre
applicazioni: Java e altro) tranite un pannello di controllo che è
atto a creare ed aggiornare questo file, devono essere trasformati in
un array perché io possa manipolarli in qualche maniera. Parliamo di
un file XML non eccessivamente pesante. La versione di PHP è la 4.3 ma
posso anche usare PHP 5. Dal PHP devo esclusivamente leggere dal file
XML.
Non so se ho risposto a tutte le vostre domande, spero di sì.   :-)
Grazie ancora, ad entrambi.

 Dal PHP devo esclusivamente leggere dal file XML.
ok, allora quello che fa per te e' simplexml:
http://it.php.net/simplexml
e' una classe built-in di php 5 che permette l'accesso in lettura ad un
xml (fa qualcosa anche in scrittura, ma solo in modifica e non in
aggiunta), ha solo un limite al momento, non legge gli attributi dei
nodi xml, questo risponde alla tua domanda iniziale
e' un oggetto che le cui proprieta' mappano la struttura dell'xml (es:
$xml->nodo[0]->sottonodo, con [0] prima occorrenza del nodo <nodo>,
spero che ti sia chiaro). se devi fare controlli sul valore di una
proprieta' o modificarne il valore ricordati di castarla, es:
if ((string)$xml->nodoTesto[0] === 'testo') {
(string)$xml->nodoDaModificare = 'testo';
questo perche' di default le proprieta' sono oggetti SimpleXmlElement e
non valori scalari
da php5 puoi usare foreach e iterare gli oggetti come per gli array,
per cui risulta molto comodo e fa in sostanza quello che vorresti fare
tu trasformando l'xml in un array
occhio che di default la classe ignora anche i campi cdata, per
abilitare la lettura di questi devi passare la costante LIBXML_NOCDATA
come secondo parametro del costruttore, se passi il path di un file
invece che una stringa xml devi anche settare a TRUE il terzo
parametro, es:
$xmlObject = new SimpleXMLElement($xmlFile, LIBXML_NOCDATA, TRUE);
(questo per caricare un file tramite path)
$xmlObject = new SimpleXMLElement($xmlString, LIBXML_NOCDATA);
(questo per caricare una stringa xml)
ovviamente l'xml deve essere strutturalmente corretto, codificato utf8
e non contenere elementi html non espansi che potrebbero dare problemi
se il file d'origine non soddisfa queste condizioni puoi sistemare con
questo:
$xmlString = utf8_encode(str_replace('&lt;', '<', str_replace('&gt;',
'>',
htmlentities(preg_replace('/([^\x9\xA\xD\x20-\xD7FF\xE000-\xFFFD])+/m',
'', file_get_contents($xmlFile)), ENT_NOQUOTES))));
prende il contenuto del file, rimuove i caratteri non utf8, espande le
entita' html, riporta &gt; e &lt; dalle entita' html ai caratteri > e <
e infine codifica in utf8, una volta passata questa procedura in teoria
non dovresti avere problemi a passare la stringa al costruttore della
classe

 classe
ok, ok, grazie infinite    :-)

 
http://it.php.net/manual/it/function.simplexml-element-attributes.php
ohi, sai che mi era toltamente sfuggito questo metodo della classe?
quindi puoi leggere anche gli attributi, ottimo (anche se non ci accedi
con la stessa immediatezza con cui accedi ai nodi)

T_PAAMAYIM_NEKUDOTAYM ha scritto:

ti segnalo anche questo:
http://www.onlamp.com/pub/a/php/2004/01/15/simplexml.html
dove si dice:
"It excels when you're only interested in an element's attributes and
text and you know the document's layout ahead of time."
ancora grazie!