いつも実行中のツールで書き込まれているXMLファイルを監視する必要があります。しかし、XMLファイルは適切に完成し、終わりにのみ閉じられます。 XMLストリーム処理などXMLファイルの読み込み中(Pythonで)
同じ制約:
- オンザフライとトリガーアクション
- 不完全なXMLファイルを解析し、最初から再度の処理を回避するために、ファイル内の最後の位置を追跡しますNeed to read XML files as a stream using BeautifulSoup in Pythonの答えに
、slezicaはxml.sax
、xml.etree.ElementTree
とcElementTree
示唆しています。しかし、xml.etree.ElementTree
とcElementTree
を使用しようとした私の試みは成功しませんでした。 xml.dom
,xml.parsers.expat
およびlxml
もありますが、「オンザフライ解析」のサポートは表示されません。
私はより多くの明白な例が必要...
私は現在、Linux上のPython 2.7を使用していますが、私は、Python 3.xのに移行します=>新しいPythonの3.xの機能に関するヒントを提供してください。また、watchdog
を使用してXMLファイルの変更を検出することもできます。>オプションで、watchdog
メカニズムを再利用します。オプションでWindowsもサポートします。
ソリューションを理解しやすい/維持するを提供してください。複雑すぎる場合は、tell()
/seek()
をファイル内で移動し、生のXMLで愚かなテキスト検索を使用し、最後に基本正規表現を使用して値を抽出することがあります。
XMLサンプル:SAXを使用して
<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>
...
...
最初のテストに失敗しました:
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)
シェル:
$ 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