2014-12-05 4 views
2

XML 덩어리를 수신하는 네트워크 응용 프로그램 (Twisted 사용)이 있습니다 (전체 XML이 전체적으로 올 수 없음) 단일 패킷으로). 내 생각으로는 XML 메시지를 천천히 빌드하는 것입니다. xml.etree.ElementTree의 iterparse에 "정착"했습니다. 나는 몇 가지 코드에 취미 삼아 봤는데 다음과 같은 (비 트위스트 코드) 잘 작동 :iterparse가 '요소를 찾을 수 없습니다 : 줄 1, 열 0'을 던지고 이유가 확실하지 않습니다.

import xml.etree.ElementTree as etree 
from io import StringIO 

chunks = ['<notorious>','<burger/>','</notorious>'] 
buff = StringIO() 

for ch in chunks: 
    buff.write(unicode(ch)) 
    if buff.getvalue() == '<notorious><burger/></notorious>': 
     print("it should work now") 
    try: 
     for event, elem in etree.iterparse(buff, events=('end',)): 
      if elem.tag == 'notorious': 
       print(etree.tostring(elem)) 
     except Exception as e: 
      print(e) 
:
import xml.etree.ElementTree as etree 
from io import StringIO 

buff = StringIO(unicode('<notorious><burger/></notorious>')) 

for event, elem in etree.iterparse(buff, events=('end',)): 
    if elem.tag == 'notorious': 
     print(etree.tostring(elem)) 

가 그럼 난 데이터가 내 말에 수신 할 수있는 방법을 시뮬레이션하기 위해 다음 코드를 내장

는하지만 코드가 그대로 출력 :

'을 (를) 찾을 수없는 요소 : 줄 1, 열 0'

나는 내 머리를 감쌀 수 없다. 두 번째 샘플의 stringIO가 첫 번째 코드 샘플에서 stringIO의 내용과 동일한 경우이 오류가 발생하는 이유는 무엇입니까?

PS :

  1. 나는 내가이에게 먼저하지만, 다른 스레드가 내 질문에 대답하지 해요 알고있다. 내가 틀렸다면 plz가 적절한 스레드를 제공합니다.
  2. 다른 모듈에 대한 제안 사항이 있으면 대답 plz에 입력하지 마십시오. 의견을 추가하다.

감사

+1

Twisted에는 이미 XMPP를 구문 분석하기위한 twisted.words에 일부 스트림 파싱 XML 항목이 포함되어 있습니다. http://twistedmatrix.com/documents/current/api/twisted.words.protocols.jabber.xmlstream.XmlStream.html을 보시길 바랍니다. – Glyph

+0

나는 바퀴를 재발견하려한다는 것을 알고있었습니다. Twisted 사이트의 모든 문서를 구문 분석하기 전에 더 나은 방법을 찾아야합니다. 여기에 질문을 게시하십시오. 라이브 및 배울 –

+1

거룩한 달콤한 아기 jeebus XmlStream 어디까지 당신은 내 인생을 다 : D 조 감사 글리프! XmlStream은 XML 스트리밍을위한 방법입니다. –

답변

3

파일 객체와 파일 - 류의 객체는 파일 위치가 있습니다. 읽기/쓰기가 완료되면 파일 위치가 앞당겨집니다. 파일의 처음부터 읽을 수 있도록 파일 오브젝트를 etree.iterparse으로 전달하기 전에 파일 위치 (<file_object>.seek(..) 사용)를 변경해야합니다.

... 
buff.seek(0) # <----- 
for event, elem in etree.iterparse(buff, events=('end',)): 
    if elem.tag == 'notorious': 
     print(etree.tostring(elem)) 
+0

나는 내가 io 위치가 "움직였다"는 것을 알지 못한다는 것을 알았다. (나는 다소 생각했지만 (0) 버퍼를 찾지 않을 것이라고 생각했다.) 고맙습니다. 내 질문에 요구 사항을 만족 시키므로 귀하의 대답을 받아 들일 것입니다. 그러나 스트리밍 XML + Twisted와 비슷한 문제가있는 모든 사용자를 위해 XmlStream (twisted.words.xish.xmlstream) –

0

파일을 작성한 후에 파일 위치는 마지막 위치를 가리 킵니다. 따라서 seek 명령을 사용하여 파일 pos를 이동해야합니다. fd.seek (0) 이제 et.parse 명령을 사용하여 파일을 열고 구문 분석 할 수 있습니다.