Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 2.7 在编写XML文件时读取它(在Python中)_Python 2.7_Python 3.x_Xml Parsing_Stream_On The Fly - Fatal编程技术网

Python 2.7 在编写XML文件时读取它(在Python中)

Python 2.7 在编写XML文件时读取它(在Python中),python-2.7,python-3.x,xml-parsing,stream,on-the-fly,Python 2.7,Python 3.x,Xml Parsing,Stream,On The Fly,我必须监视由一个整天运行的工具编写的XML文件。但是XML文件只在一天结束时正确完成并关闭 与XML流处理相同的约束: 动态解析不完整的XML文件并触发操作 跟踪文件中的最后一个位置,以避免从一开始就再次处理它 在回答、建议和cElementTree时。但是我尝试使用和cElementTree却没有成功。也有,但我看不到对“动态解析”的支持 我需要更明显的例子 我目前正在Linux上使用Python2.7,但我将迁移到Python3.x=>请同时提供有关Python3.x新特性的提示。我还使用来

我必须监视由一个整天运行的工具编写的XML文件。但是XML文件只在一天结束时正确完成并关闭

与XML流处理相同的约束:

  • 动态解析不完整的XML文件并触发操作
  • 跟踪文件中的最后一个位置,以避免从一开始就再次处理它
  • 在回答、建议和
    cElementTree
    时。但是我尝试使用和
    cElementTree
    却没有成功。也有,但我看不到对“动态解析”的支持

    我需要更明显的例子

    我目前正在Linux上使用Python2.7,但我将迁移到Python3.x=>请同时提供有关Python3.x新特性的提示。我还使用来检测XML文件修改=>或者重用该机制。也可以选择支持Windows

    请提供易于理解/维护的解决方案。如果太复杂,我可以使用
    tell()
    /
    seek()
    在文件中移动,在原始XML中使用愚蠢的文本搜索,最后使用基本正则表达式提取值


    XML示例:

    <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>
           ...
           ...
    
    外壳:

    $ 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
    
    $whilereadline;不要重复$line;睡眠1;doef.xml&
    ...
    $./test-using-sax.py
    开始:name=dfxml
    开始:name=creator
    开始:名称=程序
    结束:name=程序
    开始:名称=版本
    结束:名称=版本
    回溯(最近一次呼叫最后一次):
    文件“/testusingsax.py”,第17行,在
    parser.parse(f)
    文件“/usr/lib64/python2.7/xml/sax/expatreader.py”,第107行,解析中
    IncrementalParser.parse(self,source)
    文件“/usr/lib64/python2.7/xml/sax/xmlreader.py”,第125行,解析中
    self.close()
    文件“/usr/lib64/python2.7/xml/sax/expatreader.py”,第220行,关闭
    self.feed(“”,isFinal=1)
    文件“/usr/lib64/python2.7/xml/sax/expatreader.py”,第214行,在提要中
    self.\u err\u handler.fatalError(exc)
    fatalError中的文件“/usr/lib64/python2.7/xml/sax/handler.py”,第38行
    引发异常
    xml.sax._exceptions.SAXParseException:report.xml:15:0:未找到元素
    
    发布我的问题三小时后,没有收到任何答复。但我终于实现了我想要的简单示例

    我的灵感来自于,基于和

    脚本运行时,不要忘记触摸一个XML文件,或使用以下命令模拟即时写入:

    while read line; do echo $line; sleep 1; done <in.xml >out.xml &
    
    读行时
    ;不要重复$line;睡眠1;done out.xml&
    
    从昨天开始,我找到了关于未记录的
    xml.etree.ElementTree.XMLTreeBuilder.\u parser.EndElementHandler

    此示例与另一个类似,但使用(和)

    ElementTree
    cElementTree
    替换时,它不起作用:-/

    import time
    import watchdog.events
    import watchdog.observers
    import xml.etree.ElementTree
    
    class XmlFileEventHandler(watchdog.events.PatternMatchingEventHandler):
        def __init__(self):
            watchdog.events.PatternMatchingEventHandler.__init__(self, patterns=['*.xml'])
            self.xml_file = None
            self.parser = xml.etree.ElementTree.XMLTreeBuilder()
            def end_tag_event(tag):
                node = self.parser._end(tag)
                print 'tag=', tag, 'node=', node
            self.parser._parser.EndElementHandler = end_tag_event
    
        def on_modified(self, event):
            if not self.xml_file:
                self.xml_file = open(event.src_path)
            buffer = self.xml_file.read()
            if buffer:
                self.parser.feed(buffer)
    
    if __name__ == '__main__':
        observer = watchdog.observers.Observer()
        event_handler = XmlFileEventHandler()
        observer.schedule(event_handler, path='.')
        try:
            observer.start()
            while True:
                time.sleep(10)
        finally:
            observer.stop()
            observer.join()
    
    脚本运行时,不要忘记触摸一个XML文件,或使用此单行脚本模拟即时写入:

    while read line; do echo $line; sleep 1; done <in.xml >out.xml &
    
    我的输出:

    end program
    end version
    end creator
    end filename
    end filesize
    end tcpflow
    end fileobject
    end filename
    end filesize
    end tcpflow
    end fileobject
    end filename
    end filesize
    Traceback (most recent call last):
      File "./iter.py", line 9, in <module>
        for action, elem in context:
      File "/usr/lib64/python2.7/xml/etree/ElementTree.py", line 1281, in next
        self._root = self._parser.close()
      File "/usr/lib64/python2.7/xml/etree/ElementTree.py", line 1654, in close
        self._raiseerror(v)
      File "/usr/lib64/python2.7/xml/etree/ElementTree.py", line 1506, in _raiseerror
        raise err
    xml.etree.ElementTree.ParseError: no element found: line 20, column 0
    
    结束程序
    结束版本
    最终创造者
    结束文件名
    结束文件大小
    端tcpflow
    结束文件对象
    结束文件名
    结束文件大小
    端tcpflow
    结束文件对象
    结束文件名
    结束文件大小
    回溯(最近一次呼叫最后一次):
    文件“/iter.py”,第9行,在
    对于行动,上下文中的元素:
    文件“/usr/lib64/python2.7/xml/etree/ElementTree.py”,下一页第1281行
    self.\u root=self.\u parser.close()
    文件“/usr/lib64/python2.7/xml/etree/ElementTree.py”,第1654行,关闭
    自我提升错误(v)
    文件“/usr/lib64/python2.7/xml/etree/ElementTree.py”,第1506行,in_raiseerror
    提出错误
    xml.etree.ElementTree.ParseError:未找到元素:第20行第0列
    
    while read line; do echo $line; sleep 1; done <in.xml >out.xml &
    
    from __future__ import print_function, division
    import xml.etree.ElementTree
    
    if __name__ == '__main__':
        context = xml.etree.ElementTree.iterparse('f.xml', events=('end',))
        for action, elem in context:
            print(action, elem.tag)
    
    end program
    end version
    end creator
    end filename
    end filesize
    end tcpflow
    end fileobject
    end filename
    end filesize
    end tcpflow
    end fileobject
    end filename
    end filesize
    Traceback (most recent call last):
      File "./iter.py", line 9, in <module>
        for action, elem in context:
      File "/usr/lib64/python2.7/xml/etree/ElementTree.py", line 1281, in next
        self._root = self._parser.close()
      File "/usr/lib64/python2.7/xml/etree/ElementTree.py", line 1654, in close
        self._raiseerror(v)
      File "/usr/lib64/python2.7/xml/etree/ElementTree.py", line 1506, in _raiseerror
        raise err
    xml.etree.ElementTree.ParseError: no element found: line 20, column 0