|
|||||||
|
|
|
![]() |
|
|
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 10: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: 10:36.




















