Casa / Facebook / Analisi XML. Utilizzo di base di SimpleXML Creazione di un'istanza di un parser

Analisi XML. Utilizzo di base di SimpleXML Creazione di un'istanza di un parser

Alcuni esempi in questo tutorial includono una stringa XML. Invece di ripeterlo in ogni esempio, inserisci questa riga in un file che includi in ogni esempio. Questa linea è mostrata nell'esempio seguente. Inoltre, puoi creare un documento XML e leggerlo con la funzione simplexml_load_file().

Esempio n. 1 File Esempio.php con stringa XML

$xmlstr =<<


PHP: L'emergere del Parser


SM. Programmatore
Onlivia Actora


Sig. Programmatore
El Attore


Quindi è una lingua. È pur sempre un linguaggio di programmazione. O
è un linguaggio di scripting? È tutto rivelato in questo documentario,
come un film dell'orrore.




7
5


XML;
?>

SimpleXML è molto facile da usare! Prova a ottenere una stringa o un numero dal documento XML sottostante.

Esempio n.2 Recupero di parte di un documento

includere "esempio.php";

echo $film -> film [0]-> trama;
?>

Quindi è una lingua. È pur sempre un linguaggio di programmazione. Oppure è un linguaggio di scripting? Tutto è rivelato in questo documentario in stile film horror.

In PHP, puoi accedere a un elemento in un documento XML che contiene caratteri non validi (come un trattino) nel suo nome racchiudendo il nome dell'elemento tra parentesi graffe e apostrofi.

Esempio n. 3 Ottenere una stringa

includere "esempio.php";

echo $film -> film ->( "great-lines" )-> line ;
?>

Il risultato dell'esecuzione di questo esempio:

PHP risolve tutti i miei problemi web

Esempio n. 4 Accesso a elementi non univoci in SimpleXML

Se sono presenti più istanze di elementi figlio all'interno dello stesso elemento genitore, è necessario utilizzare i metodi di iterazione standard.

includere "esempio.php";

$film = nuovo SimpleXMLElement ($xmlstr);

/* Per ogni nodo , visualizzeremo il nome separatamente . */
foreach ($film -> film -> personaggi -> personaggio come $personaggio ) (
echo $personaggio -> nome, "riproduce", $personaggio -> attore, PHP_EOL;
}

?>

Il risultato dell'esecuzione di questo esempio:

SM. Coder interpreta Onlivia Actora Mr. Coder interpreta El Actor

Commento:

Proprietà ( $film->film nell'esempio precedente) non sono array. Questo è un oggetto iterabile sotto forma di array.

Esempio n.5 Utilizzo degli attributi

Finora abbiamo recuperato solo i nomi e i valori degli elementi. SimpleXML può anche accedere agli attributi degli elementi. Puoi accedere all'attributo di un elemento allo stesso modo degli elementi dell'array ( vettore).

includere "esempio.php";

$film = nuovo SimpleXMLElement ($xmlstr);

/* Nodo di accesso primo film.
* Visualizzeremo anche una scala di valutazione. */
foreach ($film -> film [ 0 ]-> valutazione come $valutazione) (
switch((stringa) $rating [ "tipo" ]) ( // Ottenere gli attributi dell'elemento in base all'indice
caso "pollici" :
echo $voto, "pollice in su";
rottura;
caso "stelle":
echo $rating, "stelle";
rottura;
}
}
?>

Il risultato dell'esecuzione di questo esempio:

7 pollici in su5 stelle

Esempio n.6 Confronto di elementi e attributi con il testo

Per confrontare un elemento o un attributo con una stringa o per passarlo a una funzione come testo, è necessario eseguirne il cast in una stringa utilizzando (corda). Altrimenti, PHP tratterà l'elemento come un oggetto.

includere "esempio.php";

$film = nuovo SimpleXMLElement ($xmlstr);

if ((stringa) $film -> film -> titolo == "PHP: L'emergere del Parser") {
stampa "Il mio film preferito.";
}

echo htmlentities ((stringa) $film -> film -> titolo);
?>

Il risultato dell'esecuzione di questo esempio:

Il mio film preferito.PHP: Emergence of the Parser

Esempio n.7 Confronto di due elementi

Due SimpleXMLElement sono considerati diversi anche se puntano allo stesso oggetto a partire da PHP 5.2.0.

includere "esempio.php";

$movies1 = nuovo SimpleXMLElement ($xmlstr);
$movies2 = nuovo SimpleXMLElement ($xmlstr);
var_dump($film1 == $film2); // false a partire da PHP 5.2.0
?>

Il risultato dell'esecuzione di questo esempio:

Esempio n. 8 Utilizzo di XPath

SimpleXML include il supporto XPath integrato. Cerca tutti gli elementi :

includere "esempio.php";

$film = nuovo SimpleXMLElement ($xmlstr);

foreach ($film -> xpath ("//carattere") as $carattere ) (
echo $personaggio -> nome, "riproduce", $personaggio -> attore, PHP_EOL;
}
?>

"// " funge da carattere jolly. Per specificare un percorso assoluto, omettere una delle barre.

Il risultato dell'esecuzione di questo esempio:

SM. Coder interpreta Onlivia Actora Mr. Coder è interpretato da El Actor

Esempio n.9 Impostazione dei valori

I dati in SimpleXML non devono essere immutabili. L'oggetto consente di manipolare tutti gli elementi.

includere "esempio.php";
$film = nuovo SimpleXMLElement ($xmlstr);

$film -> film [ 0 ]-> personaggi -> personaggio [ 0 ]-> nome = "Miss Coder";

echo $film -> asXML();
?>

Il risultato dell'esecuzione di questo esempio:

PHP: L'emergere del Parser Signorina Coder Onlivia Actora Sig. Programmatore El Attore 7 5

Esempio n.10 Aggiunta di elementi e attributi

A partire da PHP 5.1.3, SimpleXML ha la capacità di aggiungere facilmente elementi e attributi secondari.

includere "esempio.php";
$film = nuovo SimpleXMLElement ($xmlstr);

$carattere = $film -> film [ 0 ]-> caratteri -> addChild ("carattere");
$carattere -> addChild ("nome", "Mr. Parser");
$carattere -> addChild ("attore" , "John Doe" );

$valutazione = $film -> film [0]-> addChild ("valutazione" , "PG" );
$rating -> addAttribute ("tipo" , "mpaa" );

echo $film -> asXML();
?>

Il risultato dell'esecuzione di questo esempio:

PHP: L'emergere del Parser SM. Programmatore Onlivia Actora Sig. Programmatore El Attore Sig. AnalizzatoreJohn Do Quindi è una lingua. È pur sempre un linguaggio di programmazione. Oppure è un linguaggio di scripting? Tutto è rivelato in questo documentario in stile film horror. PHP risolve tutti i miei problemi web 7 5 PAG

Esempio n. 11 Interagire con il DOM

PHP può convertire i nodi XML dal formato SimpleXML al formato DOM e viceversa. Questo esempio mostra come modificare un elemento DOM in SimpleXML.

$dom = nuovo documento DOM;
$dom -> caricaXML ( "senza senso" );
se (! $dom) (
eco "Errore durante l'analisi del documento";
Uscita;
}

$libri = simplexml_import_dom($dom);

echo $libri -> libro [0]-> titolo;
?>

Il risultato dell'esecuzione di questo esempio:

4 anni fa

Esiste un "trucco" comune spesso proposto per convertire un oggetto SimpleXML in un array, eseguendolo tramite json_encode() e quindi json_decode(). Vorrei spiegare perché questa è una cattiva idea.

Molto semplicemente, perché lo scopo principale di SimpleXML è essere più facile da usare e più potente di un semplice array. Ad esempio, puoi scriverebar -> baz [ "bing" ] ?> e significa la stessa cosa dibar [ 0 ]-> baz [ 0 ][ "bing" ] ?> , indipendentemente da quanti elementi bar o baz sono presenti nell'XML; e se scrivibar [ 0 ]-> baz [ 0 ] ?> ottieni tutto il contenuto della stringa di quel nodo, comprese le sezioni CDATA, indipendentemente dal fatto che abbia anche elementi o attributi figli. Hai anche accesso alle informazioni sullo spazio dei nomi, alla possibilità di apportare semplici modifiche all'XML e persino alla possibilità di "importare" in un oggetto DOM, per una manipolazione molto più potente. Tutto questo si perde trasformando l'oggetto in un array invece di leggere e comprendere gli esempi in questa pagina.

Inoltre, poiché non è progettato per questo scopo, in alcune situazioni la conversione in JSON e viceversa perderà informazioni. Ad esempio, qualsiasi elemento o attributo in uno spazio dei nomi verrà semplicemente scartato e qualsiasi contenuto testuale verrà scartato se un elemento ha anche figli o attributi. A volte, questo non ha importanza, ma se prendi l'abitudine di convertire tutto in array, alla fine ti darà fastidio.

Naturalmente, potresti scrivere una conversione più intelligente, che non avesse queste limitazioni, ma a quel punto non otterrai alcun valore da SimpleXML e dovresti semplicemente utilizzare le funzioni XML Parser di livello inferiore o la classe XMLReader, per creare la tua struttura. Non avrai comunque la funzionalità extra comoda di SimpleXML, ma questa è la tua perdita.

2 anni fa

Se la tua stringa xml contiene booleani codificati con "0" e "1", incontrerai problemi quando trasmetti l'elemento direttamente a bool:

$xmlstr =<<

1
0

XML;
$valori = new SimpleXMLElement($xmlstr);
$verovalore = (bool)$valori->verovalore; // VERO
$falsovalore = (bool)$valori->falsovalore; // anche vero!!!

Invece devi prima eseguire il cast su string o int:

$verovalore = (bool)(int)$valori->verovalore; // VERO
$falsovalore = (bool)(int)$valori->falsovalore; // falso

9 anni fa

Se devi restituire un xml valido nella tua risposta, non dimenticare di impostare il tipo di contenuto dell'intestazione su xml oltre a riprodurre il risultato di asXML():

$xml = simplexml_load_file("...");
...
... roba xml
...

//output xml nella tua risposta:
header("Tipo contenuto: testo/xml");
echo $xml -> asXML();
?>

9 anni fa

Dal file README:

SimpleXML è pensato per essere un modo semplice per accedere ai dati XML.

Gli oggetti SimpleXML seguono quattro regole di base:

1) le proprietà denotano gli iteratori degli elementi
2) gli indici numerici denotano elementi
3) gli indici non numerici denotano attributi
4) la conversione di stringhe consente di accedere ai dati TESTO

Quando si iterano le proprietà, l'estensione esegue sempre l'iterazione
tutti i nodi con quel nome di elemento. Quindi il metodo children() deve essere
chiamato per scorrere i sottonodi. Ma anche facendo quanto segue:
foreach ($obj->nome_nodo come $elem) (
// fai qualcosa con $elem
}
risulta sempre in un'iterazione degli elementi "node_name". Quindi non oltre
il controllo è necessario per distinguere il numero di nodi di quel tipo.

Quando si accede ai dati TEXT di un elemento tramite una proprietà
quindi il risultato non include i dati TEXT dei sottoelementi.

Problemi conosciuti
============

Per problemi al motore al momento non è possibile accedere
un sottoelemento per indice 0: $oggetto->proprietà.

8 anni fa

Usare cose come: is_object($xml->module->admin) per verificare se esiste effettivamente un nodo chiamato "admin", non sembra funzionare come previsto, poiché simplexml restituisce sempre un oggetto, in quel caso vuoto - anche se un particolare nodo non esiste.
Per me la buona vecchia funzione empty() sembra funzionare perfettamente in questi casi.

8 anni fa

Un rapido suggerimento sulle query xpath e sugli spazi dei nomi predefiniti. Sembra che il sistema XML dietro SimpleXML abbia lo stesso funzionamento che credo utilizzi il sistema XML .NET: quando è necessario indirizzare qualcosa nello spazio dei nomi predefinito, sarà necessario dichiarare lo spazio dei nomi utilizzando RegisterXPathNamespace e quindi utilizzare il suo prefisso per indirizzare il altrimenti nell'elemento vivente dello spazio dei nomi predefinito.

$stringa =<<

Quaranta cosa?
Joe
Jane

So che questa è la risposta, ma qual è la domanda?


XML;

$xml = simplexml_load_string ($string);
$xml -> RegisterXPathNamespace("def" , "http://www.w3.org/2005/Atom");

$nodi = $xml -> xpath ("//def:document/def:titolo" );

?>

9 anni fa

Sebbene SimpleXMLElement affermi di essere iterabile, non sembra implementare correttamente le funzioni dell'interfaccia Iterator standard come::next e::reset. Pertanto, mentre foreach() funziona, funzioni come next(), current() o ciascuno() non sembrano funzionare come ci si aspetterebbe: il puntatore non sembra mai muoversi o continua a reimpostarsi.

6 anni fa

Se la codifica del documento XML non è UTF-8, la dichiarazione di codifica deve apparire immediatamente dopo version="..." e prima di standalone="...". Questo è un requisito dello standard XML.

Se la codifica del documento XML è diversa da UTF-8. La dichiarazione di codifica dovrebbe seguire immediatamente dopo la versione = "..." e prima di standalone = "...". Questo requisito è XML standard.


OK

Lingua russa. lingua russa
Errore irreversibile: eccezione "Eccezione" non rilevata con il messaggio "Impossibile analizzare la stringa come XML" in...


la pubblicazione di questo articolo è consentita solo con il collegamento al sito web dell'autore dell'articolo

In questo articolo mostrerò un esempio di come analizzare un file XML di grandi dimensioni. Se il tuo server (hosting) non vieta di aumentare il tempo di esecuzione dello script, puoi analizzare un file XML del peso di almeno gigabyte, personalmente ho analizzato solo file dall'ozono del peso di 450 megabyte.

Quando si analizzano file XML di grandi dimensioni, sorgono due problemi:
1. Memoria insufficiente.
2. Il tempo allocato non è sufficiente per l'esecuzione dello script.

Il secondo problema con il tempo può essere risolto se il server non lo vieta.
Ma il problema con la memoria è difficile da risolvere, anche se stiamo parlando del tuo server, spostare file di 500 megabyte non è molto semplice e semplicemente non è possibile aumentare la memoria su hosting e VDS.

PHP ha diverse opzioni di elaborazione XML integrate: SimpleXML, DOM, SAX.
Tutte queste opzioni sono descritte in dettaglio in molti articoli con esempi, ma tutti gli esempi dimostrano come lavorare con un documento XML completo.

Ecco un esempio, ottenendo un oggetto da un file XML

Ora puoi elaborare questo oggetto, MA...
Come puoi vedere, l'intero file XML viene letto in memoria, quindi tutto viene analizzato in un oggetto.
Cioè, tutti i dati vanno in memoria e se non c'è abbastanza memoria allocata, lo script si interrompe.

Questa opzione non è adatta per l'elaborazione di file di grandi dimensioni; è necessario leggere il file riga per riga ed elaborare questi dati uno per uno.
In questo caso il controllo di validità viene effettuato anche man mano che i dati vengono elaborati, quindi è necessario poter eseguire il rollback, ad esempio, cancellare tutti i dati inseriti nel database in caso di file XML non valido, oppure effettuare due passaggi attraverso il file, prima letto per verificarne la validità, quindi letto per l'elaborazione dei dati.

Ecco un esempio teorico di analisi di un file XML di grandi dimensioni.
Questo script legge un carattere alla volta da un file, raccoglie questi dati in blocchi e li invia al parser XML.
Questo approccio risolve completamente il problema della memoria e non causa un carico, ma aggrava il problema nel tempo. Come provare a risolvere il problema nel tempo, leggi di seguito.

Funzione webi_xml ($file)
{

########
### funzione dati

{
stampa $dati;
}
############################################



{
stampa $nome;
print_r($attrs);
}


## funzione tag di chiusura
funzione endElement ($parser, $nome)
{
stampa $nome;
}
############################################

($xml_parser, "dati");

// apri il file
$fp = fopen($file, "r");

$perviy_vxod = 1; $dati = "" ;



{

$simvol = fgetc ($fp); $dati.= $simvol;


if($simvol!= ">" ) ( continua;)


eco "

rottura;
}

$dati = "" ;
}
fclose($fp);

Webi_xml("1.xml");

?>

In questo esempio, inserisco tutto in un'unica funzione webi_xml() e in fondo puoi vederne la chiamata.
Lo script stesso è costituito da tre funzioni principali:
1. Una funzione che intercetta l'apertura del tag startElement()
2. Una funzione che intercetta il tag endElement() di chiusura
3. E la funzione di ricezione dei dati data() .

Supponiamo che il contenuto del file 1.xml sia una ricetta



< title >Pane semplice
< ingredient amount = "3" unit = "стакан" >Farina
< ingredient amount = "0.25" unit = "грамм" >Lievito
< ingredient amount = "1.5" unit = "стакан" >Acqua calda
< ingredient amount = "1" unit = "чайная ложка" >Sale
< instructions >
< step > Mescolare tutti gli ingredienti e impastare accuratamente.
< step > Coprire con un panno e lasciare riposare per un'ora in una stanza tiepida..
< step > Impastare ancora, posizionare su una teglia e infornare.
< step > Visita il sito


Iniziamo il tutto richiamando la funzione generale webi_xml ("1.xml" );
Successivamente, il parser si avvia in questa funzione e converte tutti i nomi dei tag in maiuscolo in modo che tutti i tag abbiano lo stesso caso.

$xml_parser = xml_parser_create();
xml_parser_set_option($xml_parser, XML_OPTION_CASE_FOLDING, true);

Ora indichiamo quali funzioni funzioneranno per catturare l'apertura di un tag, la chiusura e l'elaborazione dei dati

xml_set_element_handler($xml_parser, "startElement", "endElement");
xml_set_character_data_handler($xml_parser, "dati");

Successivamente avviene l'apertura del file specificato, scorrendo il file un carattere alla volta e ogni carattere viene aggiunto alla variabile stringa finché non viene trovato il carattere > .
Se questo è il primo accesso al file, lungo il percorso verrà eliminato tutto ciò che non è necessario all'inizio del file, tutto ciò che viene prima , questo è il tag con cui dovrebbe iniziare XML.
Per la prima volta, una variabile stringa conterrà una stringa

E invialo allo smontatore
xml_parse ($xml_parser, $data, feof ($fp));
Dopo l'elaborazione dei dati, la variabile stringa viene reimpostata e la raccolta dei dati in una stringa ricomincia e la stringa viene formata per la seconda volta

Al terzo
</b><br>il quarto <br><b>Pane semplice

Tieni presente che una variabile stringa è sempre formata da un tag completato > e non è necessario inviare al ladro, ad esempio, un tag aperto e chiuso con i dati
Pane semplice
È importante che questo gestore riceva un tag intero ininterrotto, almeno un tag aperto e nel passaggio successivo un tag chiuso, oppure riceva immediatamente 1000 righe di un file, non importa, l'importante è che il tag non si rompe, ad esempio

le>Pane semplice
In questo modo è impossibile inviare i dati al gestore, poiché il tag è strappato.
Puoi inventare il tuo metodo per inviare dati al gestore, ad esempio raccogliere 1 megabyte di dati e inviarlo al gestore per aumentare la velocità, assicurati solo che i tag siano sempre completati e che i dati possano essere strappati
Semplice</b><br><b>pane

Pertanto, nelle parti che desideri, puoi inviare un file di grandi dimensioni al processore.

Vediamo ora come vengono trattati questi dati e come ottenerli.

Cominciamo con la funzione dei tag di apertura elemento iniziale ($parser, $nome, $attrs)
Supponiamo che l'elaborazione abbia raggiunto la linea
< ingredient amount = "3" unit = "стакан" >Farina
Quindi all'interno della funzione la variabile $nome sarà uguale a ingrediente cioè il nome del tag aperto (non si è ancora arrivati ​​alla chiusura del tag).
Anche in questo caso sarà disponibile un array di attributi di questo tag $attrs che conterrà dei dati importo = "3" e unità = "bicchiere".

Successivamente i dati della variabile aperta sono stati elaborati dalla funzione dati ($parser, $dati)
La variabile $data conterrà tutto ciò che si trova tra i tag di apertura e chiusura, nel nostro caso questo è il testo Muka

E l'elaborazione della nostra stringa da parte della funzione termina endElement ($parser, $nome)
Questo è il nome del tag chiuso, nel nostro caso $name sarà uguale a ingrediente

E dopo tutto è tornato di nuovo in circolo.

L'esempio sopra dimostra solo il principio dell'elaborazione XML, ma per l'applicazione reale deve essere modificato.
In genere, è necessario analizzare XML di grandi dimensioni per immettere dati nel database e per elaborarli correttamente è necessario sapere a quale tag aperto appartengono i dati, a quale livello di annidamento dei tag e quali tag sono aperti nella gerarchia superiore. Con queste informazioni è possibile elaborare il file correttamente senza problemi.
Per fare ciò, è necessario introdurre diverse variabili globali che raccoglieranno informazioni su tag aperti, nidificazione e dati.
Ecco un esempio che puoi utilizzare

Funzione webi_xml ($file)
{
globale $profondità_webi; // contatore per tenere traccia della profondità di nidificazione
$profondità_webi = 0;
globale $webi_tag_open; // conterrà un array di tag attualmente aperti
$webi_tag_open = array();
globale $webi_data_temp ; // questo array conterrà i dati di un tag

####################################################
### funzione dati
dati della funzione ($parser, $dati)
{
globale $profondità_webi;
globale $webi_tag_open;
globale $webi_data_temp ;
// aggiunge dati all'array indicando l'annidamento e il tag attualmente aperto
$webi_data_temp [ $webi_profondità ][ $webi_tag_open [ $webi_profondità ]][ "dati" ].= $dati ;
}
############################################

####################################################
### funzione tag di apertura
funzione startElement ($parser, $nome, $attrs)
{
globale $profondità_webi;
globale $webi_tag_open;
globale $webi_data_temp ;

// se il livello di nidificazione non è più zero, un tag è già aperto
// e i suoi dati sono già nell'array, puoi elaborarli
se ($webi_profondità)
{




" ;

stampa "
" ;
print_r($webi_tag_open); // array di tag aperti
stampa "


" ;

// dopo aver elaborato i dati, eliminali per liberare memoria
unset($GLOBALS ["webi_data_temp" ][ $webi_profondità]);
}

// ora viene aperto il tag successivo e l'ulteriore elaborazione avverrà nel passaggio successivo
$webi_profondità++; // aumenta l'annidamento

$webi_tag_open [$webi_profondità]= $nome; // aggiunge un tag aperto all'array di informazioni
$webi_data_temp [ $webi_profondità ][ $nome ][ "attrs" ]= $attrs ; // ora aggiungi gli attributi del tag

}
###############################################

#################################################
## funzione tag di chiusura
funzione endElement ($parser, $nome) (
globale $profondità_webi;
globale $webi_tag_open;
globale $webi_data_temp ;

// qui inizia l'elaborazione dei dati, ad esempio l'aggiunta al database, il salvataggio in un file, ecc.
// $webi_tag_open contiene una catena di tag aperti per livello di nidificazione
// ad esempio $webi_tag_open[$webi_profondità] contiene il nome del tag aperto le cui informazioni sono attualmente in fase di elaborazione
// Livello di nidificazione del tag $webi_profondità
// $webi_data_temp[$webi_length][$webi_tag_open[$webi_length]]["attrs"] array di attributi dei tag
// $webi_data_temp[$webi_length][$webi_tag_open[$webi_ Depth]]["data"] tagga i dati

Stampa "dati" . $webi_tag_open [ $webi_profondità ]. "--" .($webi_data_temp [ $webi_profondità ][ $webi_tag_open [ $webi_profondità ]][ "dati" ]). "
" ;
print_r ($webi_data_temp [ $webi_ Depth ][ $ Webi_tag_open [ $ Webi_Depth ]] ["attrs"]);
stampa "
" ;
print_r($webi_tag_open);
stampa "


" ;

Annulla impostazione($GLOBALS ["webi_data_temp"]); // dopo aver elaborato i dati, cancelliamo l'intero array con i dati, poiché il tag è stato chiuso
unset($GLOBALS ["webi_tag_open" ][ $webi_profondità]); // cancella le informazioni su questo tag aperto... da quando è stato chiuso

$profondità_webi --; // riduce l'annidamento
}
############################################

$xml_parser = xml_parser_create();
xml_parser_set_option($xml_parser, XML_OPTION_CASE_FOLDING, true);

// indica quali funzioni funzioneranno durante l'apertura e la chiusura dei tag
xml_set_element_handler($xml_parser, "startElement", "endElement");

// specifica una funzione per lavorare con i dati
xml_set_character_data_handler($xml_parser, "dati");

// apri il file
$fp = fopen($file, "r");

$perviy_vxod = 1; // flag per controllare la prima voce nel file
$dati = "" ; // qui raccogliamo i dati dal file in parti e li inviamo al parser xml

// esegue un ciclo finché non viene trovata la fine del file
while (! feof ($fp) e $fp)
{
$simvol = fgetc ($fp); // legge un carattere dal file
$dati.= $simvol; // aggiunge questo carattere ai dati da inviare

// se il carattere non è il tag di fine, torna all'inizio del ciclo e aggiunge un altro carattere ai dati, e così via finché non viene trovato il tag di fine
if($simvol!= ">" ) ( continua;)
// se è stato trovato il tag di chiusura, ora invieremo i dati raccolti per l'elaborazione

// controlla se questa è la prima voce nel file, quindi elimineremo tutto ciò che si trova prima del tag// poiché a volte potresti incontrare spazzatura prima dell'inizio dell'XML (editor maldestri o il file è stato ricevuto da uno script da un altro server)
if($perviy_vxod) ($dati = strstr ($dati, "

// ora inserisce i dati nel parser xml
if (! xml_parse ($xml_parser, $data, feof ($fp))) (

// qui puoi elaborare e ricevere errori di validità...
// non appena viene rilevato un errore, l'analisi si interrompe
eco "
Errore XML: " . xml_error_string(xml_get_error_code($xml_parser));
echo "in linea" . xml_get_current_line_number ($xml_parser);
rottura;
}

// dopo l'analisi, scarta i dati raccolti per il passaggio successivo del ciclo.
$dati = "" ;
}
fclose($fp);
xml_parser_free($xml_parser);
// rimozione delle variabili globali
unset($GLOBALS ["profondità_webi"]);
unset($GLOBALS ["webi_tag_open"]);
unset($GLOBALS ["webi_data_temp"]);

Webi_xml("1.xml");

?>

L'intero esempio è accompagnato da commenti, ora prova e sperimenta.
Tieni presente che quando si lavora con i dati, i dati non vengono semplicemente inseriti in un array, ma piuttosto aggiunti utilizzando " .=" poiché i dati potrebbero non arrivare nella loro interezza e, se effettui semplicemente un incarico, di tanto in tanto riceverai i dati in blocchi.

Bene, questo è tutto, ora c'è abbastanza memoria durante l'elaborazione di un file di qualsiasi dimensione, ma il tempo di esecuzione dello script può essere aumentato in diversi modi.
Inserisci una funzione all'inizio dello script
set_limite_tempo(6000);
O
ini_set ("max_execution_time", "6000");

Oppure aggiungi testo al file .htaccess
php_value max_execution_time 6000

Questi esempi aumenteranno il tempo di esecuzione dello script a 6000 secondi.
È possibile aumentare il tempo in questo modo solo quando la modalità provvisoria è disattivata.

Se hai accesso per modificare php.ini puoi aumentare il tempo utilizzando
tempo_max_esecuzione = 6000

Ad esempio, sull'hosting Masterhost, al momento della stesura di questo articolo, è vietato aumentare il tempo di script, nonostante la modalità provvisoria sia disattivata, ma se sei un professionista, puoi creare il tuo PHP build sul Masterhost, ma questo è non in questo articolo.

Fase 1. Superamento test (interazione con il circuito di test GIS GMP) #GIS Indirizzo del servizio test GMP:
gisgmp.wsdlLocation=http://213.59.255.182:7777/gateway/services/SID0003663?wsdl
gisgmp.wsdlLocation.endPoint=http://213.59.255.182:7777/gateway/services/SID0003663
Questo indirizzo è registrato nelle impostazioni SP. Inoltre, è necessario registrarlo nel file delle impostazioni di registrazione, specificando il valore TRACCIA. Dopo aver inserito i valori specificati è necessario avviare il client SP e il client ACC (riavviare se è già stato avviato), quindi dal ROR o dall'Applicazione di Contabilità/AU per il pagamento dei fondi è necessario eseguire l'azione “Crea informazioni di pagamento”, se i controlli di sistema vengono superati, verranno create le informazioni sul pagamento. Che successivamente dovrà essere scaricato.
Dopo il caricamento, è necessario verificare lo stato utilizzando l'azione "Richiedi stato di elaborazione". Successivamente le informazioni sul pagamento ED passano allo stato "Accettato da GIS GMP" -...

Dato: Tabella MSG (messaggi) con molte voci.
CREATETABLEmsg(idINTEGERNOTNULLPRIMARYKEY,descrizioneCHAR(50)NOTNULL, date_createDATE);
Compito:
È necessario cancellare la tabella dei dati/
Soluzione: Esistono diversi modi per risolvere questo problema. Di seguito è riportata una descrizione ed un esempio di ciascuno di essi.
La via più facile ( prima opzione) - esecuzione dell'operatore di cancellazione dei record. Quando lo esegui, vedrai il risultato (quanti record sono stati cancellati). Una cosa utile quando hai bisogno di sapere con certezza e capire se sono stati cancellati i dati corretti. MA presenta degli svantaggi rispetto ad altre opzioni per risolvere il problema.

DELETE FROMmsg;--Elimina tutte le righe nella tabella --Elimina tutte le righe con data di creazione "2019.02.01" DELETE FROMmsg WHEREdate_create="2019.02.01";

Seconda opzione. Utilizzo dell'istruzione DML per cancellare tutte le righe in una tabella.
TRUNCATETABLEmsg;
Esistono diverse funzionalità nell'utilizzo di questo operatore:
Non è disponibile in Firebird, quindi utilizziamo la prima e la terza opzione. Dopo il completamento...

Indirizzi attuali per le richieste a SMEV 3.0 Si ricorda che, secondo quanto già pubblicato sul Portale Tecnologico SMEV 3.0, è necessario utilizzare gli attuali indirizzi per il Servizio Telematico Unificato:
l'indirizzo del servizio elettronico unificato dell'ambiente di sviluppo SMEV 3.0, corrispondente allo schema 1.1 - http://smev3-d.test.gosuslugi.ru:7500/smev/v1.1/ws?wsdl, e il servizio inoltre essere disponibile a

XML Extensible Markup Language è un insieme di regole per la codifica di documenti in formato leggibile dalla macchina. XML è un formato popolare per lo scambio di dati su Internet. I siti che aggiornano frequentemente il proprio contenuto, come siti di notizie o blog, spesso forniscono un feed XML in modo che i programmi esterni siano consapevoli delle modifiche al contenuto. L'invio e l'analisi dei dati XML è un'attività comune per le applicazioni connesse alla rete. Questa lezione spiega come analizzare i documenti XML e utilizzare i relativi dati.

Scelta di un parser

Analisi dei canali

Il primo passo nell'analisi di un feed è decidere a quali campi dati sei interessato. Il parser estrae i campi specificati e ignora tutto il resto.

Ecco uno snippet del canale che verrà esplorato nell'applicazione di esempio. Ogni post su StackOverflow.com viene visualizzato in un feed come tag di ingresso, che contiene diversi sottotag:

domande più recenti contrassegnate con Android - Stack Overflow ... ... http://stackoverflow.com/q/9439999 0 Dov'è il mio file di dati? scogliera2310 http://stackoverflow.com/users/1128925 2012-02-25T00:30:54Z 2012-02-25T00:30:54Z

Ho un'applicazione che richiede un file di dati...

... ...

L'applicazione di esempio recupera i dati dal tag di ingresso e dai relativi sottotag titolo, collegamento e riepilogo.

Creazione di un'istanza del parser

Il passo successivo è creare un'istanza del parser e avviare il processo di analisi. Questo frammento inizializza il parser per non gestire gli spazi dei nomi e per utilizzare l'InputStream fornito come input. Il processo di analisi inizia con una chiamata a nextTag() e chiama il metodo readFeed(), che recupera ed elabora i dati a cui l'applicazione è interessata:

Classe pubblica StackOverflowXmlParser ( // Non utilizziamo spazi dei nomi private static final String ns = null; public List parse(InputStream in) genera XmlPullParserException, IOException ( try ( XmlPullParser parser = Xml.newPullParser(); parser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES , false); parser.setInput(in, null); parser.nextTag(); return readFeed(parser); ) finalmente ( in.close(); ) ) ... )

Sottrai canale

Il metodo readFeed() svolge il lavoro vero e proprio di elaborazione del feed. Gli elementi contrassegnati con il tag "entry" sono il punto di partenza per l'elaborazione ricorsiva del canale. Se il tag successivo non è un tag di ingresso, viene saltato. Dopo che l'intero "feed" è stato elaborato ricorsivamente, readFeed() restituisce un elenco contenente le voci (inclusi gli elementi di dati nidificati) recuperate dal feed. Questo elenco viene quindi restituito dal parser.

Private List readFeed(XmlPullParser parser) lancia XmlPullParserException, IOException ( Voci dell'elenco = new ArrayList (); parser.require(XmlPullParser.START_TAG, ns, "feed"); while (parser.next() != XmlPullParser.END_TAG) ( if (parser.getEventType() != XmlPullParser.START_TAG) ( continue; ) String name = parser.getName(); // Inizia cercando il tag di ingresso if (name.equals("entry")) (entry.add( readEntry(parser)); ) else ( skip(parser); ) ) restituisce le voci; )

Analisi XML

I passaggi per analizzare il feed XML sono i seguenti:

Questo frammento mostra come il parser analizza voce, titolo, collegamento e riepilogo.

Voce della classe statica pubblica (titolo stringa finale pubblica; collegamento stringa finale pubblica; riepilogo stringa finale pubblica; voce privata (titolo stringa, riepilogo stringa, collegamento stringa) ( this.title = titolo; this.summary = riepilogo; this.link = collegamento ; ) ) // Analizza il contenuto di una voce. Se incontra un titolo, un riepilogo o un tag di collegamento, li trasmette // ai rispettivi metodi di "lettura" per l'elaborazione. Altrimenti salta il tag. private Entry readEntry(XmlPullParser parser) genera XmlPullParserException, IOException ( parser.require(XmlPullParser.START_TAG, ns, "entry"); String title = null; String summary = null; String link = null; while (parser.next() ! = XmlPullParser.END_TAG) ( if (parser.getEventType() != XmlPullParser.START_TAG) ( continua; ) String name = parser.getName(); if (name.equals("titolo")) ( title = readTitle(parser) ; ) else if (name.equals("summary")) ( summary = readSummary(parser); ) else if (name.equals("link")) ( link = readLink(parser); ) else ( skip(parser) ; ) ) restituisce una nuova voce (titolo, riepilogo, collegamento); ) // Elabora i tag del titolo nel feed. private String readTitle(XmlPullParser parser) genera IOException, XmlPullParserException ( parser.require(XmlPullParser.START_TAG, ns, "titolo"); String title = readText(parser); parser.require(XmlPullParser.END_TAG, ns, "titolo"); return title; ) // Elabora i tag di collegamento nel feed. private String readLink(XmlPullParser parser) genera IOException, XmlPullParserException ( String link = ""; parser.require(XmlPullParser.START_TAG, ns, "link"); String tag = parser.getName(); String relType = parser.getAttributeValue(null , "rel"); if (tag.equals("link")) ( if (relType.equals("alternate"))( link = parser.getAttributeValue(null, "href"); parser.nextTag(); ) ) parser.require(XmlPullParser.END_TAG, ns, "link"); return link; ) // Elabora i tag di riepilogo nel feed. private String readSummary(XmlPullParser parser) genera IOException, XmlPullParserException ( parser.require(XmlPullParser.START_TAG, ns, "summary"); String summary = readText(parser); parser.require(XmlPullParser.END_TAG, ns, "summary"); return summary; ) // Per i tag title e summary, estrae i relativi valori di testo. private String readText(XmlPullParser parser) genera IOException, XmlPullParserException ( String result = ""; if (parser.next() == XmlPullParser.TEXT) ( result = parser.getText(); parser.nextTag(); ) restituisce risultato; ) ... )

Saltare gli elementi che non ti servono

In uno dei passaggi di analisi XML descritti sopra, il parser salta i tag che non ci interessano. Di seguito è riportato il codice parser per il metodo skip():

Private void skip(parser XmlPullParser) lancia XmlPullParserException, IOException ( if (parser.getEventType() != XmlPullParser.START_TAG) ( lancia new IllegalStateException(); ) int profondità = 1; while (profondità != 0) ( switch (parser. next()) ( case XmlPullParser.END_TAG: profondità--; break; case XmlPullParser.START_TAG: profondità++; break; ) ) )

Ecco come funziona:

  • Il metodo genera un'eccezione se l'evento corrente non è START_TAG .
  • Consuma START_TAG e tutti gli eventi fino a END_TAG.
  • Per assicurarsi che si fermi all'END_TAG corretto e non al primo tag dopo l'START_TAG originale, tiene traccia della profondità di nidificazione.

Pertanto, se l'elemento corrente ha elementi nidificati, il valore di profondità non sarà 0 finché il parser non avrà elaborato tutti gli eventi tra l'START_TAG originale e il corrispondente END_TAG . Ad esempio, considera come passa l'analizzatore un elemento che ha 2 elementi nidificati, E :

  • Al primo passaggio nel ciclo while, il tag successivo che l'analizzatore incontra questo è START_TAG per
  • Al secondo passaggio del ciclo while, il tag successivo incontrato dall'analizzatore è END_TAG
  • Al terzo passaggio del ciclo while, il tag successivo incontrato dall'analizzatore è START_TAG . Il valore della profondità viene aumentato a 2.
  • Al quarto passaggio del ciclo while, il tag successivo incontrato dall'analizzatore è END_TAG. Il valore della profondità viene ridotto a 1.
  • Al quinto e ultimo passaggio del ciclo while, il tag successivo incontrato dall'analizzatore è END_TAG. Il valore della profondità è ridotto a 0, a indicare ciò l'elemento è stato saltato con successo.

Elaborazione dati XML

L'applicazione di esempio riceve e analizza un feed XML in un AsyncTask. L'elaborazione avviene all'esterno del thread principale dell'interfaccia utente. Al termine dell'elaborazione, l'applicazione aggiorna l'interfaccia utente nell'attività principale (NetworkActivity).

Nello snippet seguente, il metodo loadPage() esegue le seguenti operazioni:

  • Inizializza una variabile stringa con un URL che punta a un feed XML.
  • Se le impostazioni dell'utente e la connessione di rete lo consentono, chiama new DownloadXmlTask().execute(url) . Questo crea un nuovo oggetto DownloadXmlTask ​​(sottoclasse AsyncTask) ed esegue il suo metodoexe(), che scarica e analizza la pipe e restituisce un risultato di stringa che verrà visualizzato nell'interfaccia utente.
la classe pubblica NetworkActivity estende l'attività ( public static final String WIFI = "Wi-Fi"; public static final String ANY = "Qualsiasi"; private static final String URL = "http://stackoverflow.com/feeds/tag?tagnames=android&sort =più nuovo"; // Se è presente una connessione Wi-Fi. private static boolean wifiConnected = false; // Se è presente una connessione mobile. private static boolean mobileConnected = false; // Se la visualizzazione deve essere aggiornata. public static boolean refreshDisplay = true; public static String sPref = null; ... // Utilizza AsyncTask per scaricare il feed XML da stackoverflow.com. public void loadPage() ( if((sPref.equals(ANY)) && (wifiConnected || mobileConnected )) ( new DownloadXmlTask().execute(URL); ) else if ((sPref.equals(WIFI)) && (wifiConnected)) ( new DownloadXmlTask().execute(URL); ) else ( // mostra errore ) )
  • doInBackground() esegue il metodo loadXmlFromNetwork(). Passa l'URL del canale come parametro. Il metodo loadXmlFromNetwork() riceve ed elabora il canale. Al termine dell'elaborazione, restituisce la stringa risultante.
  • onPostExecute() prende la stringa restituita e la visualizza nell'interfaccia utente.
// Implementazione di AsyncTask utilizzata per scaricare feed XML da stackoverflow.com. la classe privata DownloadXmlTask ​​estende AsyncTask ( @Override protected String doInBackground(String... urls) ( try ( return loadXmlFromNetwork(urls); ) catch (IOException e) ( return getResources().getString(R.string.connection_error); ) catch (XmlPullParserException e) ( return getResources().getString(R.string.xml_error); ) ) @Override protected void onPostExecute(String result) ( setContentView(R.layout.main); // Visualizza la stringa HTML nell'interfaccia utente tramite WebView WebView myWebView = (WebView) findViewById(R.id.webview); myWebView.loadData(risultato, "testo/html", null); ) )

Di seguito è riportato il metodo loadXmlFromNetwork() che viene chiamato da DownloadXmlTask. Fa quanto segue:

  1. Crea un'istanza di StackOverflowXmlParser. Crea inoltre variabili per gli oggetti Voce di elenco e titolo, URL e riepilogo, per memorizzare i valori estratti dal feed XML per questi campi.
  2. Chiama downloadUrl() che scarica il canale e lo restituisce come InputStream.
  3. Utilizza StackOverflowXmlParser per analizzare un InputStream. StackOverflowXmlParser popola le voci dell'elenco con i dati del feed.
  4. Elabora le voci List e combina i dati del canale con il markup HTML.
  5. Restituisce la stringa HTML visualizzata nell'interfaccia utente dell'attività principale, AsyncTask, nel metodo onPostExecute().
// Carica XML da stackoverflow.com, lo analizza e lo combina con // markup HTML. Restituisce una stringa HTML. private String loadXmlFromNetwork(String urlString) genera XmlPullParserException, IOException ( InputStream stream = null; // Crea un'istanza del parser StackOverflowXmlParser stackOverflowXmlParser = new StackOverflowXmlParser(); List voci = nulle; Titolo stringa = null; Stringa URL = null; Riepilogo stringhe = null; Calendario rightNow = Calendar.getInstance(); Formattatore DateFormat = new SimpleDateFormat("MMM dd h:mmaa"); // Controlla se l'utente ha impostato la preferenza per includere il testo di riepilogo SharedPreferences sharedPrefs = PreferenceManager.getDefaultSharedPreferences(this); boolean pref = sharedPrefs.getBoolean("summaryPref", false); StringBuilder htmlString = new StringBuilder(); htmlString.append("

" + getResources().getString(R.string.page_title) + "

"); htmlString.append(" " + getResources().getString(R.string.updated) + " " + formatter.format(rightNow.getTime()) + ""); try ( stream = downloadUrl(urlString); items = stackOverflowXmlParser.parse(stream); // Si assicura che InputStream sia chiuso dopo che l'app // ha finito di usarlo. ) infine ( if (stream!= null) ( stream.close(); ) ) // StackOverflowXmlParser restituisce un elenco (chiamato "voci") di oggetti Entry. // Ogni oggetto Entry rappresenta un singolo post nel feed XML. // Questa sezione elabora l'elenco delle voci per combinarli voce con markup HTML. // Ogni voce viene visualizzata nell'interfaccia utente come un collegamento che facoltativamente include // un riepilogo testuale. for (Voce voce: voci) ( htmlString.append("

" + voce.titolo + "

"); // Se l'utente imposta la preferenza per includere il testo di riepilogo, // lo aggiunge alla visualizzazione. if (pref) ( htmlString.append(entry.summary); ) ) return htmlString.toString(); ) // Data una rappresentazione di stringa di un URL, imposta una connessione e ottiene // un flusso di input. private InputStream downloadUrl(String urlString) genera IOException ( URL url = new URL(urlString); HttpURLConnection conn = (HttpURLConnection) url.openConnection() ; conn.setReadTimeout(10000 /* millisecondi */); conn.setConnectTimeout(15000 /* millisecondi */); conn.setRequestMethod("GET"); conn.setDoInput(true); // Avvia la query conn.connect( ); return conn.getInputStream(); )

L'analisi XML significa essenzialmente esaminare un documento XML e restituire i dati corrispondenti. Sebbene un numero crescente di servizi Web restituiscano dati in formato JSON, la maggior parte utilizza ancora XML, quindi è importante padroneggiare l'analisi XML se si desidera utilizzare l'intera gamma di API disponibili.

Utilizzando l'estensione SimpleXML in PHP, che è stato aggiunto di nuovo in PHP 5.0, lavorare con XML è molto facile e semplice. In questo articolo ti mostrerò come farlo.

Nozioni di base sull'uso

Cominciamo con il seguente esempio lingue.xml:


>

> 1972>
> Dennis Richie >
>

> 1995>
> Rasmus Lerdorf >
>

> 1995>
> James Gosling >
>
>

Questo documento XML contiene un elenco di linguaggi di programmazione con alcune informazioni su ciascun linguaggio: l'anno in cui è stato introdotto e il nome del suo creatore.

Il primo passo è caricare l'XML utilizzando le funzioni simplexml_load_file(), O simplexml_load_string(). Come suggerisce il nome delle funzioni, la prima caricherà XML da un file e la seconda caricherà XML da una stringa.

Entrambe le funzioni leggono l'intero albero DOM in memoria e restituiscono un oggetto ElementoXMLE semplice. Nell'esempio precedente, l'oggetto è memorizzato nella variabile $linguals. È possibile utilizzare le funzioni var_dump() O stampa_r() per ottenere dettagli sull'oggetto restituito, se lo desideri.

Oggetto SimpleXMLElement
[lang] => Array
[ 0 ] => Oggetto SimpleXMLElement
[@attributes] => Array
[nome] => C
[apparso] => 1972
[creatore] => Dennis Ritchie
[ 1 ] => Oggetto SimpleXMLElement
[@attributes] => Array
[nome] => PHP
[apparso] => 1995
[creatore] => Rasmus Lerdorf
[ 2 ] => Oggetto SimpleXMLElement
[@attributes] => Array
[nome] => Java
[apparso] => 1995
[creatore] => James Gosling
)
)

Questo XML contiene un elemento root le lingue, all'interno del quale si trovano tre elementi lang. Ogni elemento dell'array corrisponde a un elemento lang nel documento XML.

È possibile accedere alle proprietà di un oggetto utilizzando l'operatore -> . Ad esempio, $linguals->lang ti restituirà un oggetto SimpleXMLElement che corrisponde al primo elemento lang. Questo oggetto contiene due proprietà: apparso e creatore.

$lingue -> lang[0] -> apparso;
$lingue -> lang[0] -> creatore;

Visualizzare un elenco di lingue e mostrare le loro proprietà può essere fatto molto facilmente utilizzando un ciclo standard come per ciascuno.

foreach ($lingue -> lang as $lang) (
printf(
"" ,
$lang ["nome"],
$lang -> è apparso,
$lang -> creatore
) ;
}

Nota come ho effettuato l'accesso al nome dell'attributo lang dell'elemento per ottenere il nome della lingua. In questo modo puoi accedere a qualsiasi attributo di un elemento rappresentato come oggetto SimpleXMLElement.

Lavorare con gli spazi dei nomi

Mentre lavori con XML di vari servizi web, ti imbatterai più di una volta negli spazi dei nomi degli elementi. Cambiamo il nostro lingue.xml per mostrare un esempio di utilizzo di uno spazio dei nomi:



xmlns:dc =>

> 1972>
> Dennis Richie >
>

> 1995>
> Rasmus Lerdorf >
>

> 1995>
> James Gosling >
>
>

Ora l'elemento Creatore si adatta allo spazio dei nomi DC che punta a http://purl.org/dc/elements/1.1/. Se provi a stampare i creatori del linguaggio utilizzando il nostro codice precedente, non funzionerà. Per leggere gli spazi dei nomi degli elementi è necessario utilizzare uno dei seguenti approcci.

Il primo approccio consiste nell'utilizzare i nomi URI direttamente nel codice quando si accede allo spazio dei nomi dell'elemento. L'esempio seguente mostra come eseguire questa operazione:

$dc = $lingue -> lang[1] -> children( "http://purl.org/dc/elements/1.1/") ;
echo $dc -> creatore;

Metodo bambini() accetta uno spazio dei nomi e restituisce elementi figlio che iniziano con un prefisso. Richiede due argomenti, il primo dei quali è lo spazio dei nomi XML e il secondo è un argomento facoltativo predefinito falso. Se il secondo argomento è impostato su TRUE, lo spazio dei nomi verrà trattato come un prefisso. Se FALSE, lo spazio dei nomi verrà trattato come uno spazio dei nomi URL.

Il secondo approccio consiste nel leggere i nomi URI dal documento e utilizzarli quando si accede allo spazio dei nomi dell'elemento. Questo è in realtà un modo migliore per accedere agli elementi perché non è necessario essere codificati nell'URI.

$namespaces = $linguals -> getNamespaces (true) ;
$dc = $lingue -> lang[1] -> children (($namespaces ["dc"]) ;

echo $dc -> creatore;

Metodo OttieniSpazi dei nomi() restituisce un array di nomi di prefisso e i relativi URI associati. Accetta un parametro aggiuntivo che per impostazione predefinita è falso. Se lo imposti come VERO, questo metodo restituirà i nomi utilizzati nei nodi padre e figlio. Altrimenti, trova gli spazi dei nomi utilizzati solo nel nodo genitore.

Ora puoi scorrere l'elenco delle lingue in questo modo:

$lingue = simplexml_load_file ("lingue.xml" ) ;
$ns = $lingue -> getNamespaces (true) ;

foreach ($lingue -> lang as $lang) (
$dc = $lang -> figli ($ns ["dc"]) ;
printf(
"

%s è apparso in %d ed è stato creato da %s .

" ,
$lang ["nome"],
$lang -> è apparso,
$dc -> creatore
) ;
}

Esempio pratico: analisi di un canale video da YouTube

Diamo un'occhiata a un esempio che riceve un feed RSS da un canale YouTube e visualizza i collegamenti a tutti i video da esso. A tale scopo rivolgersi al seguente indirizzo:

http://gdata.youtube.com/feeds/api/users/xxx/uploads

L'URL restituisce un elenco degli ultimi video di un determinato canale in formato XML. Analizzeremo l'XML e otterremo le seguenti informazioni per ciascun video:

  • Collegamento al video
  • Miniatura
  • Nome

Inizieremo cercando e caricando l'XML:

$canale = "nome_canale";
$url = "http://gdata.youtube.com/feeds/api/users/". $canale. "/caricamenti";
$xml = file_get_contents($url);

$feed = simplexml_load_string ($xml) ;
$ns = $feed -> getNameSpaces (true);

Se guardi il feed XML, puoi vedere che ci sono diversi elementi lì entità, ognuno dei quali memorizza informazioni dettagliate su un video specifico dal canale. Ma utilizziamo solo miniature di immagini, URL del video e titolo. Questi tre elementi sono discendenti dell'elemento gruppo, che, a sua volta, è figlio di iscrizione:

>

>



Titolo… >

>

>

Esamineremo semplicemente tutti gli elementi iscrizione, e per ognuno di essi estrarremo le informazioni necessarie. notare che giocatore miniatura E titolo sono nello spazio dei nomi media. Dobbiamo quindi procedere come nell’esempio precedente. Otteniamo i nomi dal documento e utilizziamo lo spazio dei nomi quando accediamo agli elementi.

foreach ($feed -> voce come $voce) (
$gruppo = $voce -> figli ($ns ["media"]) ;
$gruppo = $gruppo -> gruppo;
$thumbnail_attrs = $gruppo -> miniatura [1] -> attributi ();
$immagine = $thumbnail_attrs ["url"];
$giocatore = $gruppo -> giocatore -> attributi () ;
$link = $giocatore ["url"];
$titolo = $gruppo -> titolo;
printf( "

" ,
$giocatore, $immagine, $titolo);
}

Conclusione

Ora che sai come usarlo SimpleXML Per l'analisi dei dati XML, puoi migliorare le tue capacità analizzando diversi feed XML con API diverse. Ma è importante considerare che SimpleXML legge l'intero DOM in memoria, quindi se stai analizzando un set di dati di grandi dimensioni, potresti rimanere senza memoria. Per saperne di più su SimpleXML leggi la documentazione.


In caso di domande, ti consigliamo di utilizzare il nostro