|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Senior Member
Iscritto dal: Dec 2006
Città: Brescia
Messaggi: 497
|
[Python] Parsing di un file xml
ciao a tutti,
un'applicazione mi fornisce in output un file (ad esempio chiamato xml.dump) di cui dovrei fare un parsing tramite python in modo da potere processare i suoi diversi tag. ho importato il modulo minidom correttamente, ma quando eseguo la linea di codice: Codice:
minidom.parse('C:\\xml.dump') Codice:
Traceback (most recent call last): File "<pyshell#147>", line 1, in -toplevel- minidom.parse('C:\\xml.dump') File "C:\Python23\lib\xml\dom\minidom.py", line 1915, in parse return expatbuilder.parse(file) File "C:\Python23\lib\xml\dom\expatbuilder.py", line 924, in parse result = builder.parseFile(fp) File "C:\Python23\lib\xml\dom\expatbuilder.py", line 207, in parseFile parser.Parse(buffer, 0) ExpatError: junk after document element: line 66, column 0 grazie |
![]() |
![]() |
![]() |
#2 |
Senior Member
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
|
Non ho mai usato il miniDOM parser, ma xml.parsers.expat.
Comunque posta il file xml.dump (io lo chiamerei dump.xml ![]() ![]()
__________________
Per iniziare a programmare c'è solo Python con questo o quest'altro (più avanzato) libro @LinkedIn Non parlo in alcun modo a nome dell'azienda per la quale lavoro Ho poco tempo per frequentare il forum; eventualmente, contattatemi in PVT o nel mio sito. Fanboys |
![]() |
![]() |
![]() |
#3 |
Senior Member
Iscritto dal: Dec 2006
Città: Brescia
Messaggi: 497
|
anche io lo rinominerei *.xml, ma l'applicazione che fa il dump a ora mi consegna un file con quell'estensione.
il contenuto del file non è importante. anche con un file xml base mi da gli stessi problemi! forse il problema è dipendente dal contenuto delle parentesi (non so se è corretto scrivere il percorso intero del file) |
![]() |
![]() |
![]() |
#4 |
Senior Member
Iscritto dal: Dec 2006
Città: Brescia
Messaggi: 497
|
ho provato a usare xml.parsers.expat e ho risultati migliori, anche se dopo queste righe di codice:
Codice:
>>> import xml.parsers.expat >>> p = xml.parsers.expat.ParserCreate() >>> docxml = p.Parse('xml-001322.dump') >>> print docxml |
![]() |
![]() |
![]() |
#5 |
Senior Member
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
|
Io lo uso così:
Codice:
self.p = xml.parsers.expat.ParserCreate() self.p.buffer_text = True self.p.returns_unicode = False self.p.StartElementHandler = self.start_element self.p.EndElementHandler = self.end_element self.p.CharacterDataHandler = self.char_data All'interno di una classe, ovviamente. Gli handler sono metodi della classe (ma possono anche essere funzioni esterne).
__________________
Per iniziare a programmare c'è solo Python con questo o quest'altro (più avanzato) libro @LinkedIn Non parlo in alcun modo a nome dell'azienda per la quale lavoro Ho poco tempo per frequentare il forum; eventualmente, contattatemi in PVT o nel mio sito. Fanboys |
![]() |
![]() |
![]() |
#6 |
Senior Member
Iscritto dal: Dec 2006
Città: Brescia
Messaggi: 497
|
in che classe hai messo tutto questo?
e poi come faresti la chiamata al fantomatico xml.dump? |
![]() |
![]() |
![]() |
#7 |
Senior Member
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
|
E' una normalissima classe. La puoi creare anche vuota.
![]() Per usarlo basta fare così: Codice:
with open('xml.dump') as f: self.p.ParseFile(f) ![]()
__________________
Per iniziare a programmare c'è solo Python con questo o quest'altro (più avanzato) libro @LinkedIn Non parlo in alcun modo a nome dell'azienda per la quale lavoro Ho poco tempo per frequentare il forum; eventualmente, contattatemi in PVT o nel mio sito. Fanboys |
![]() |
![]() |
![]() |
#8 |
Senior Member
Iscritto dal: Dec 2006
Città: Brescia
Messaggi: 497
|
ciao,
ho provato a fare come hai detto tu, mettendo quelle righe di codice in una classe, che chiamo parsing Codice:
class parsing: self.p = xml.parsers.expat.ParserCreate() self.p.buffer_text = True self.p.returns_unicode = False self.p.StartElementHandler = self.start_element self.p.EndElementHandler = self.end_element self.p.CharacterDataHandler = self.char_data a te sembreranno cose ovvie, ma per me che sono agli inizi della programmazione in python non lo sono per niente! |
![]() |
![]() |
![]() |
#9 |
Senior Member
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
|
Potevi dirlo prima.
![]() Ecco qua: Codice:
from __future__ import with_statement import xml.parsers.expat class SimpleXMLParser(object): def __init__(self, FileName): self.p = xml.parsers.expat.ParserCreate() self.p.buffer_text = True self.p.returns_unicode = False self.p.StartElementHandler = self.start_element self.p.EndElementHandler = self.end_element self.p.CharacterDataHandler = self.char_data with open(FileName) as f: self.p.ParseFile(f) def start_element(self, name, attrs): print 'Ho trovato il tag', name, 'con gli attributi', attrs def end_element(self, name): print 'Tag', name, 'chiuso' def char_data(self, data): print 'In mezzo al tag ho trovato questi dati:', data SimpleXMLParser('xml.dump') ![]()
__________________
Per iniziare a programmare c'è solo Python con questo o quest'altro (più avanzato) libro @LinkedIn Non parlo in alcun modo a nome dell'azienda per la quale lavoro Ho poco tempo per frequentare il forum; eventualmente, contattatemi in PVT o nel mio sito. Fanboys |
![]() |
![]() |
![]() |
#10 |
Senior Member
Iscritto dal: Dec 2006
Città: Brescia
Messaggi: 497
|
ok!
ho provato a compilare tutto, mettendolo in un file (es parser.py)! mi da questo errore Codice:
SyntaxError: Invalid Syntax Codice:
with open(FileName) as f: grazie per la pazienza! ![]() |
![]() |
![]() |
![]() |
#11 |
Senior Member
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
|
Probabilmente c'è qualche problema di indentazione.
Eventualmente riportami il file che hai creato o il traceback dello stack. P.S. Di nulla. ![]()
__________________
Per iniziare a programmare c'è solo Python con questo o quest'altro (più avanzato) libro @LinkedIn Non parlo in alcun modo a nome dell'azienda per la quale lavoro Ho poco tempo per frequentare il forum; eventualmente, contattatemi in PVT o nel mio sito. Fanboys |
![]() |
![]() |
![]() |
#12 |
Senior Member
Iscritto dal: Dec 2006
Città: Brescia
Messaggi: 497
|
eccolo qui:
Codice:
from __future__ import with_statement import xml.parsers.expat class SimpleXMLParser(object): def __init__(self, FileName): self.p = xml.parsers.expat.ParserCreate() self.p.buffer_text = True self.p.returns_unicode = False self.p.StartElementHandler = self.start_element self.p.EndElementHandler = self.end_element self.p.CharacterDataHandler = self.char_data with open(FileName) as f: self.p.ParseFile(f) def start_element(self, name, attrs): print 'Ho trovato il tag', name, 'con gli attributi', attrs def end_element(self, name): print 'Tag', name, 'chiuso' def char_data(self, data): print 'In mezzo al tag ho trovato questi dati:', data SimpleXMLParser('xml.dump') |
![]() |
![]() |
![]() |
#13 | ||
Senior Member
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
|
Quote:
Il codice corretto è questo: Codice:
from __future__ import with_statement import xml.parsers.expat class SimpleXMLParser(object): def __init__(self, FileName): self.p = xml.parsers.expat.ParserCreate() self.p.buffer_text = True self.p.returns_unicode = False self.p.StartElementHandler = self.start_element self.p.EndElementHandler = self.end_element self.p.CharacterDataHandler = self.char_data with open(FileName) as f: self.p.ParseFile(f) def start_element(self, name, attrs): print 'Ho trovato il tag', name, 'con gli attributi', attrs def end_element(self, name): print 'Tag', name, 'chiuso' def char_data(self, data): print 'In mezzo al tag ho trovato questi dati:', data SimpleXMLParser('xml.dump') Quote:
__________________
Per iniziare a programmare c'è solo Python con questo o quest'altro (più avanzato) libro @LinkedIn Non parlo in alcun modo a nome dell'azienda per la quale lavoro Ho poco tempo per frequentare il forum; eventualmente, contattatemi in PVT o nel mio sito. Fanboys |
||
![]() |
![]() |
![]() |
#14 |
Senior Member
Iscritto dal: Dec 2006
Città: Brescia
Messaggi: 497
|
anche così indentato mi da lo stesso errore!
![]() |
![]() |
![]() |
![]() |
#15 |
Senior Member
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
|
Prima di postarlo l'ho provato. Ecco qua (scusa la censura, ma ho ho usato un xml di produzione):
Codice:
D:\Test>python "Prova XML.py" Ho trovato il tag PEPCommandList con gli attributi {'xmlns:xsi': 'http://www.w3.org/2001/XMLSchema-instance', 'xsi:noNamespaceSchemaLocation': '\\PEPCommand .xsd'} In mezzo al tag ho trovato questi dati: Ho trovato il tag PEPCommand con gli attributi {} In mezzo al tag ho trovato questi dati: Ho trovato il tag id_comando con gli attributi {'value': '1383288'} Tag id_comando chiuso In mezzo al tag ho trovato questi dati: Ho trovato il tag id_autorizzazione con gli attributi {'idAuth': '2'} Tag id_autorizzazione chiuso In mezzo al tag ho trovato questi dati: Ho trovato il tag id_csp con gli attributi {'IDValue': '***CENSORED***'} Tag id_csp chiuso In mezzo al tag ho trovato questi dati: Ho trovato il tag op_type con gli attributi {'op_typeValue': 'DISATTIVAZIONE'} Tag op_type chiuso In mezzo al tag ho trovato questi dati: Ho trovato il tag username con gli attributi {'nameValue': '***CENSORED***'} Tag username chiuso In mezzo al tag ho trovato questi dati: Ho trovato il tag type con gli attributi {'typeValue': 'TRIGGER_CLASSICO'} Tag type chiuso In mezzo al tag ho trovato questi dati: Ho trovato il tag canale_in con gli attributi {'chosenInStream': 'SMS'} Tag canale_in chiuso In mezzo al tag ho trovato questi dati: Ho trovato il tag canale_out con gli attributi {'chosenOutStream': 'WAP-PUSH'} Tag canale_out chiuso In mezzo al tag ho trovato questi dati: Ho trovato il tag categoria con gli attributi {'serviceId': '***CENSORED***'} Tag categoria chiuso In mezzo al tag ho trovato questi dati: Ho trovato il tag motivo con gli attributi {'motivoValue': 'Stato Utenza'} Tag motivo chiuso In mezzo al tag ho trovato questi dati: Ho trovato il tag la_mittente con gli attributi {'la_mittenteValue': '12345'} Tag la_mittente chiuso In mezzo al tag ho trovato questi dati: Tag PEPCommand chiuso In mezzo al tag ho trovato questi dati: Tag PEPCommandList chiuso
__________________
Per iniziare a programmare c'è solo Python con questo o quest'altro (più avanzato) libro @LinkedIn Non parlo in alcun modo a nome dell'azienda per la quale lavoro Ho poco tempo per frequentare il forum; eventualmente, contattatemi in PVT o nel mio sito. Fanboys |
![]() |
![]() |
![]() |
#16 |
Senior Member
Iscritto dal: Dec 2006
Città: Brescia
Messaggi: 497
|
non riesco a capire il problema che ho.
mi spieghi la linea di codice from __future__ import with_statement |
![]() |
![]() |
![]() |
#17 |
Senior Member
Iscritto dal: Dec 2006
Città: Brescia
Messaggi: 497
|
ok, ora mi stampa a video le informazioni!
ho cancellato la prima riga di import e ho usato al posto delle due linee in cui apre il file questa unica riga di codice: self.p.ParseFile(open(FileName)) così funziona! ora devo formattare meglio l'output perchè il dump che ricevo in ingresso è formato da più tag "<?xml.." e infatti dopo il primo elemento di quel file mi da queste linee di errore: Codice:
Traceback (most recent call last): File "parser.py", line 24 in ? SimpleXMLParser('xml.dump') File "parser.py", line 13, in __init__ self.p.ParseFile(open(FileName)) xml.parsers.expat.ExpatError: junk after document element: line 66, column 0 CREARE UNA FINESTRA CHE MI MOSTRI I VARI TAG PADRE CON ALL'INTERNO I TAG FIGLIO Ultima modifica di Sick Boy : 02-10-2008 alle 09:54. |
![]() |
![]() |
![]() |
#18 | |||
Senior Member
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
|
Quote:
Quote:
Quote:
__________________
Per iniziare a programmare c'è solo Python con questo o quest'altro (più avanzato) libro @LinkedIn Non parlo in alcun modo a nome dell'azienda per la quale lavoro Ho poco tempo per frequentare il forum; eventualmente, contattatemi in PVT o nel mio sito. Fanboys |
|||
![]() |
![]() |
![]() |
#19 | |
Senior Member
Iscritto dal: Dec 2006
Città: Brescia
Messaggi: 497
|
e per questo problema? il dump che ha più tag xml cosa faresti?
Quote:
|
|
![]() |
![]() |
![]() |
#20 |
Senior Member
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
|
Non mi sembra sia un XML standard. Dovrebbe avere un solo tag <xml
In questo caso dovresti prendere il file, leggerlo in memoria, suddividerlo nelle sezioni xml presenti e parserizzarle una alla volta.
__________________
Per iniziare a programmare c'è solo Python con questo o quest'altro (più avanzato) libro @LinkedIn Non parlo in alcun modo a nome dell'azienda per la quale lavoro Ho poco tempo per frequentare il forum; eventualmente, contattatemi in PVT o nel mio sito. Fanboys |
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 13:02.