Back to top

Autore Topic: Parsing XML non standard con JSimpleXML  (Letto 3986 volte)

Offline GAM

  • Nuovo arrivato
  • *
  • Post: 13
    • Mostra profilo
Parsing XML non standard con JSimpleXML
« il: 03 Feb 2014, 15:13:49 »
Salve,
stavo provando ad effettuare il parsing di una stringa xml che non segue gli standard propri dell'XML, attraverso il parserXML di joomla 2.5, cioè JSimpleXML.

Eccovi un esempio dell'xml che dovrò parsare:

Codice: [Seleziona]
<data result="ok">
<items>
<item id="1" des="xyz" idmod="12" iddesmod="prova1" ver="2" desver="prova2">
</item>
<item id="2" des="xyz" idmod="13" iddesmod="prova3" ver="3" desver="prova4">
</item>
</items>
</data>

Il problema, anche ovvio dato che non si tratta di una formattazione standard xml, è che appena eseguo il parsing di questa stringa, il parser mi risponde dicendomi:
Codice: [Seleziona]
XML Parsing Error at 1:1. Error 4: Not well-formed (invalid token)
Sapreste indicarmi un metodo alternativo per parsare questa particolare formattazione simile ad xml?

Grazie




[EDIT: piccolo errore di cut&past del codice postato.. adesso è ok]
« Ultima modifica: 03 Feb 2014, 19:46:43 da GAM »

Offline mmleoni

  • Global Moderator
  • Instancabile
  • *****
  • Post: 5547
  • Sesso: Maschio
  • Just another *nix coder/sysadmin...
    • Mostra profilo
Re:Parsing XML non standard con JSimpleXML
« Risposta #1 il: 03 Feb 2014, 15:21:25 »
non esistono particolari formati di xml: o è xml well formatted o non è xml. ed è giusto che sia così, finalmente qualcuno lo ha capito!

lo standard xml prevede che un parser debba rifiutarsi di processare codice non standard, quindi nessuna soluzione: se vuoi processare la stringa con un parser xml deve essere xml.

metodo alternativo: scriviti un tuo parser, ho fatti dare un file xml.

ciao,
marco

mmleoni web consulting - creazione siti web aziendali ed e-commerce avanzati - sviluppo moduli e componenti Joomla

Offline simone83

  • Appassionato
  • ***
  • Post: 362
  • Sesso: Maschio
    • Mostra profilo
Re:Parsing XML non standard con JSimpleXML
« Risposta #2 il: 03 Feb 2014, 17:54:48 »
La cosa fondamentale da capire è, ma chi genera questo pseudo xml?, xche xml non è. Se lo generi tu allora basta che lo formatti come si deve, se ti ritorna come risposta ad una richiesta remota, allora c'e da mettersi le mani nei capelli.
BRAINCODE
Da Psd a Joomla - Sviluppo componenti joomla - SEO con Joomla
x-brain

Offline GAM

  • Nuovo arrivato
  • *
  • Post: 13
    • Mostra profilo
Re:Parsing XML non standard con JSimpleXML
« Risposta #3 il: 03 Feb 2014, 19:06:05 »
viene ritornato come risposta ad una richiesta remota purtroppo.. secondo te è possibile fare uno string replace dei tag usati in questo pseudo xml con quelli previsti dallo standard, in modo tale da rendere fattibile il parsing xml? di fatto i tag usati sono solo quelli che vedete nell'esempio di codice sopra.


forse faccio prima a crearmi un parser che analizza questo tipo di formattazione

Offline simone83

  • Appassionato
  • ***
  • Post: 362
  • Sesso: Maschio
    • Mostra profilo
Re:Parsing XML non standard con JSimpleXML
« Risposta #4 il: 03 Feb 2014, 19:18:47 »
mi sembra strano che la gente possa mettere a disposizione sta roba, bah.
prova ad eliminare da qua i tag <items> e </items> che a quanto vedo non servono a nulla

BRAINCODE
Da Psd a Joomla - Sviluppo componenti joomla - SEO con Joomla
x-brain

Offline GAM

  • Nuovo arrivato
  • *
  • Post: 13
    • Mostra profilo
Re:Parsing XML non standard con JSimpleXML
« Risposta #5 il: 03 Feb 2014, 19:22:50 »
la sostituzione che intendevo io è la seguente:


sostituire il tag <data result="ok"> con <document>


sostituire il tag <items> con <node>


sostituire il tag <item> con <child>


e aggiungere all'inizio <?xml version="1.0" encoding="utf-8" standalone="yes"?>


In questo modo non dovrei rendere quello pseudo-xml un vero e proprio documento xml?

Offline simone83

  • Appassionato
  • ***
  • Post: 362
  • Sesso: Maschio
    • Mostra profilo
Re:Parsing XML non standard con JSimpleXML
« Risposta #6 il: 03 Feb 2014, 19:34:23 »
no, il problema di questo codice è che hai tag Items che non si chiudono mai, oltre alla dichiarazione dell'xml,
non è che non vanno bene i nomi, o gli attributi ma è la struttura che è sbagliata
BRAINCODE
Da Psd a Joomla - Sviluppo componenti joomla - SEO con Joomla
x-brain

Offline GAM

  • Nuovo arrivato
  • *
  • Post: 13
    • Mostra profilo
Re:Parsing XML non standard con JSimpleXML
« Risposta #7 il: 03 Feb 2014, 19:38:51 »
ma i tag "item" ed "items" si chiudono nel codice che ho postato.. "items" racchiude tutti i vari "item"


[EDIT: ho sistemato il codice che avevo postato.. in effetti è come ti dicevo, ovvero il tag <items> racchiude tutti i vari tag <item>]
« Ultima modifica: 03 Feb 2014, 19:47:48 da GAM »

Offline simone83

  • Appassionato
  • ***
  • Post: 362
  • Sesso: Maschio
    • Mostra profilo
Re:Parsing XML non standard con JSimpleXML
« Risposta #8 il: 04 Feb 2014, 11:29:48 »
Adesso mi torna, ma guarda che questo è xml, a me lo legge tranquillamente. Posta il codice che usi per leggerlo
BRAINCODE
Da Psd a Joomla - Sviluppo componenti joomla - SEO con Joomla
x-brain

Offline GAM

  • Nuovo arrivato
  • *
  • Post: 13
    • Mostra profilo
Re:Parsing XML non standard con JSimpleXML
« Risposta #9 il: 04 Feb 2014, 13:04:40 »
Ecco il codice che ho creato:


Codice: [Seleziona]
<?php



defined
('_JEXEC') or die('Restricted access');
jimport'joomla.http.factory' );
jimport'joomla.http.http' );
jimport'joomla.http.response' );
jimport'joomla.utilities.xmlelement' );
jimport'joomla.utilities.simplexml' );



class 
modHelloWorldHelper
{

    public static function 
getHello$params )
    {

        
//URL a cui mando in post la stringa 'xyz'
        
$url "http://www.miaurl.it/index.php?input=xyz";



        
//istanza dell'oggetto JHttpFactory per l'invio in post verso l'URL indicata sopra
        
$http JHttpFactory::getHttp();


        
//invio in post

        
$resp $http->post($url);


        
//leggo la response ottenuta (notare che ciò che ottengo è una stringa della stessa identica forma dell'XML che ho postato precedentemente nell'esempio)
        
$data htmlspecialchars($resp->body);


        
//istanzio un oggetto JSimpleXML necessario al parsing della stringa $data

        
$xml = new JSimpleXML();


        
//carico con l'apposito metodo della classe JSimpleXML la stringa $data (loadString ritorna un oggetto JSimpleXMLElement se tutto va bene)

        
$xml->loadString($data);


        
//stampo a video il contenuto di $xml
        
return print_r($xml);



  }
}
?>



Notare che quando stampo il risultato di $xml, l'output che ottengo è il seguente:


Codice: [Seleziona]
JSimpleXML Object ( [_parser:JSimpleXML:private] => Resource id #108 [document] => [_stack:JSimpleXML:private] => Array ( ) [_errors:protected] => Array ( ) ) 1


Ed inoltre joomla mi avvisa con un messaggio di errore, dicendomi:


Codice: [Seleziona]
XML Parsing Error at 1:1. Error 4: Not well-formed (invalid token)

Offline simone83

  • Appassionato
  • ***
  • Post: 362
  • Sesso: Maschio
    • Mostra profilo
Re:Parsing XML non standard con JSimpleXML
« Risposta #10 il: 04 Feb 2014, 14:32:48 »
Meno male che ti ho fatto postare il codice senno ci si poteva stare una vita!

Ti da errore chiaramente xche sai cosa stai facendo qua?
Codice: [Seleziona]
$data = htmlspecialchars($resp->body);
stai trasformando l'xml in html sostituendo i < e > con &lt; &gt;

e poi provi a costruire un oggetto con dell'input errato

ps

JSimpleXML è deprecato

BRAINCODE
Da Psd a Joomla - Sviluppo componenti joomla - SEO con Joomla
x-brain

Offline GAM

  • Nuovo arrivato
  • *
  • Post: 13
    • Mostra profilo
Re:Parsing XML non standard con JSimpleXML
« Risposta #11 il: 04 Feb 2014, 14:43:35 »
ok.. ora provo ad aggiustare il codice ;-) intanto grazie!


ma visto che JSimpleXML è deprecato, cosa si fa in questi casi per usare una classe più nuova?

Offline simone83

  • Appassionato
  • ***
  • Post: 362
  • Sesso: Maschio
    • Mostra profilo
Re:Parsing XML non standard con JSimpleXML
« Risposta #12 il: 04 Feb 2014, 14:59:43 »
JSimpleXMLti dice cosa fase, va usato SimpleXml. Se non ti muovi da cotesta versione puoi continuare ad usarlo
BRAINCODE
Da Psd a Joomla - Sviluppo componenti joomla - SEO con Joomla
x-brain

Offline GAM

  • Nuovo arrivato
  • *
  • Post: 13
    • Mostra profilo
Re:Parsing XML non standard con JSimpleXML
« Risposta #13 il: 04 Feb 2014, 15:09:30 »
Grazie simone83, sei stato gentilissimo!  ;)

 



Web Design Bolzano Kreatif