python - 在 Python 中将附加数据增量解析到外部 XML 文件

标签 python xml python-2.6

我的 LAN 网络中的外部计算机上有一个日志文件。日志是一个 XML 文件。文件无法从 http 访问,并且每秒更新一次。 目前我正在将日志文件复制到我的计算机并运行解析器,但我想直接从外部主机解析文件。

如何在 Python 中完成?是否有可能一次解析整个文件,然后在以后的版本中仅解析添加到末尾的新内容?

最佳答案

您可以使用 paramikoxml.sax的默认解析器 xml.sax.expatreader,它实现了 xml.sax.xmlreader.IncrementalParser

我在本地虚拟机上运行了以下脚本来生成 XML。

#!/bin/bash

echo "<root>" > data.xml
I=0
while sleep 2; do 
  echo "<entry><a>value $I</a><b foo='bar' /></entry>" >> data.xml; 
  I=$((I + 1)); 
done

这是增量消费者。

#!/usr/bin/env python
# -*- coding: utf-8 -*-


import time
import xml.sax
from contextlib import closing

import paramiko.client


class StreamHandler(xml.sax.handler.ContentHandler):

  lastEntry = None
  lastName  = None


  def startElement(self, name, attrs):
    self.lastName = name
    if name == 'entry':
      self.lastEntry = {}
    elif name != 'root':
      self.lastEntry[name] = {'attrs': attrs, 'content': ''}

  def endElement(self, name):
    if name == 'entry':
      print({
        'a' : self.lastEntry['a']['content'],
        'b' : self.lastEntry['b']['attrs'].getValue('foo')
      }) 
      self.lastEntry = None

  def characters(self, content):
    if self.lastEntry:
      self.lastEntry[self.lastName]['content'] += content


if __name__ == '__main__':
  # use default ``xml.sax.expatreader``
  parser = xml.sax.make_parser()
  parser.setContentHandler(StreamHandler())

  client = paramiko.client.SSHClient()
  # or use ``client.load_system_host_keys()`` if appropriate
  client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
  client.connect('192.168.122.40', username = 'root', password = 'pass')
  with closing(client) as ssh:
    with closing(ssh.open_sftp()) as sftp:
      with closing(sftp.open('/root/data.xml')) as f:
        while True:
          buffer = f.read(4096)
          if buffer:
            parser.feed(buffer)
          else:
            time.sleep(2)

关于python - 在 Python 中将附加数据增量解析到外部 XML 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28826085/

相关文章:

python - 遍历 string->string dict 只给出每个的第一个字符

xml - ASP.NET JSON Web 服务总是返回用 XML 包装的 JSON 响应

c# - 从字符串解析 XML

python - Pickle 在 python 2.6 上不考虑我注册的自定义类型 reduce 函数

带有 urllib 的 Python 线程

c++ - Python - 如何检查弱引用是否仍然可用

python - 使用 AND OR 运算符进行 bool 查询

python - 在 python 中使用 glob 获取文件列表

php - AS3 共享对象未正确刷新和 XML/PHP

python - pyinstaller创建的exe文件,运行时找不到自定义模块