Ich muss eine XML-Datei überwachen, die von einem Tool geschrieben wird, das den ganzen Tag läuft. Die XML-Datei wird jedoch erst am Ende des Tages korrekt ausgefüllt und geschlossen.XML-Datei lesen, während sie geschrieben wird (in Python)
gleiche Einschränkungen wie XML-Stream-Verarbeitung:
- eine unvollständige XML-Datei on-the-fly Parsen und Aktionen auslösen
- Spur der letzten Position hält in der Datei wieder von Anfang an der Verarbeitung, es zu vermeiden
Auf Antwort von Need to read XML files as a stream using BeautifulSoup in Python, slezica schlägt xml.sax
, xml.etree.ElementTree
und cElementTree
. Aber kein Erfolg mit meinen Versuchen, xml.etree.ElementTree
und cElementTree
zu verwenden. Es gibt auch xml.dom
, xml.parsers.expat
und lxml
, aber ich sehe keine Unterstützung für "On-the-Fly-Parsing".
Ich brauche mehr offensichtliche Beispiele ...
ich zur Zeit mit Python bin 2.7 auf Linux, aber ich werde auch Tipps, neue Python 3.x Funktionen bieten zu Python 3.x => bitte migrieren. Ich benutze auch watchdog
, um XML-Dateiänderungen zu erkennen => Verwenden Sie optional den Mechanismus watchdog
. Optional unterstützt auch Windows.
Bitte geben Sie einfach zu verstehen/zu pflegen Lösungen. Wenn es zu komplex ist, kann ich einfach tell()
/seek()
verwenden, um innerhalb der Datei zu verschieben, dumme Textsuche im XML-Rohdatenformat zu verwenden und schließlich die Werte mithilfe von Basic Regex zu extrahieren.
XML Beispiel:
<dfxml xmloutputversion='1.0'>
<creator version='1.0'>
<program>TCPFLOW</program>
<version>1.4.6</version>
</creator>
<configuration>
<fileobject>
<filename>file1</filename>
<filesize>288</filesize>
<tcpflow packets='12' srcport='1111' dstport='2222' family='2' />
</fileobject>
<fileobject>
<filename>file2</filename>
<filesize>352</filesize>
<tcpflow packets='12' srcport='3333' dstport='4444' family='2' />
</fileobject>
<fileobject>
<filename>file3</filename>
<filesize>456</filesize>
...
...
Erster Test mit SAX fehlgeschlagen:
import xml.sax
class StreamHandler(xml.sax.handler.ContentHandler):
def startElement(self, name, attrs):
print 'start: name=', name
def endElement(self, name):
print 'end: name=', name
if name == 'root':
raise StopIteration
if __name__ == '__main__':
parser = xml.sax.make_parser()
parser.setContentHandler(StreamHandler())
with open('f.xml') as f:
parser.parse(f)
Shell:
$ while read line; do echo $line; sleep 1; done <i.xml >f.xml &
...
$ ./test-using-sax.py
start: name= dfxml
start: name= creator
start: name= program
end: name= program
start: name= version
end: name= version
Traceback (most recent call last):
File "./test-using-sax.py", line 17, in <module>
parser.parse(f)
File "/usr/lib64/python2.7/xml/sax/expatreader.py", line 107, in parse
xmlreader.IncrementalParser.parse(self, source)
File "/usr/lib64/python2.7/xml/sax/xmlreader.py", line 125, in parse
self.close()
File "/usr/lib64/python2.7/xml/sax/expatreader.py", line 220, in close
self.feed("", isFinal = 1)
File "/usr/lib64/python2.7/xml/sax/expatreader.py", line 214, in feed
self._err_handler.fatalError(exc)
File "/usr/lib64/python2.7/xml/sax/handler.py", line 38, in fatalError
raise exception
xml.sax._exceptions.SAXParseException: report.xml:15:0: no element found