2014-01-16 4 views
1

눈 추적기는 TCP/IP 통신 및 XML을 사용하여 클라이언트 (응용 프로그램)와 서버 (아이 추적기)간에 데이터를 전송합니다. 다음은 시력 추적기가 켜져있는 동안 지속적으로받는 XML 데이터 문자열의 예입니다. 내가하고 싶은 것은 FPOGX와 FPOGY 데이터를 다른 함수의 입력으로 사용할 수 있다는 것입니다. 문제는 변수가 아니라 단순히 호출 할 수 없다는 것입니다. 이 데이터 스트림을 어떻게 파싱합니까? XML으로 작업 한 것은 이번이 처음입니다. 예제는 크게 감사하겠습니다. 감사! 여기 Python의 XML 문자열 조각에서 구문 분석

CLIENT SEND: <SET ID="ENABLE_SEND_COUNTER" STATE="1" /> 
SERVER SEND: <ACK ID="ENABLE_SEND_COUNTER" STATE="1" /> 
CLIENT SEND: <SET ID="ENABLE_SEND_POG_FIX" STATE="1" /> 
SERVER SEND: <ACK ID="ENABLE_SEND_POG_FIX" STATE="1" /> 
CLIENT SEND: <SET ID="ENABLE_SEND_DATA" STATE="1" /> 
SERVER SEND: <ACK ID="ENABLE_SEND_DATA" STATE="1" /> 
SERVER SEND: <REC CNT="72" FPOGX="0.5065" FPOGY="0.4390" 
FPOGD="0.078" FPOGID="468" FPOGV="1"/> 
SERVER SEND: <REC CNT="73" FPOGX="0.5071" FPOGY="0.4409" 
FPOGD="0.094" FPOGID="468" FPOGV="1"/> 
SERVER SEND: <REC CNT="74" FPOGX="0.5077" FPOGY="0.4428" 
FPOGD="0.109" FPOGID="468" FPOGV="1"/> 

코드의 일부의 단편이다 자체

import xml.etree.cElementTree as ET 
import cv2 
import cv 
import socket 

# Code to grab different data from eye-tracker 
'...' 
# Code to create window and initialize camera 
'...' 
def xmlParse(): 
    rxdat = s.recv(1024) # Syntax from eye-tracker to grab XML data stream of <REC /> 
    if(rxdat.find("ACK") == 1): # First two XML have the <ACK /> tag but I don't need those 
     pass 
    else: # Here is the part where it parses and converts the data to float 
     rxdat = '<data>' + rxdat + '</data>' 
     xml = ET.fromstring(rxdat) 
     for element in xml: 
      X = float(xml[0].attrib['FPOGX']) 
      Y = float(xml[0].attrib['FPOGY']) 
     return (X, Y) 

# Def to average samples of incoming X and Y 
'...' 
# Def that uses xmlParse() and average() to return the averages of X and Y 
'...' 
# Def for mouse click events 
'...' 
# Some code that makes our window graphics 
'...' 
for i in range(0,2): # Round-about way to get rid of the first two "NoneType" 
    xmlParse() 

while True: 
    Img = cv.QueryFrame(capture) # capture defined earlier 
    drawarrow(polyF, polyB, polyL, polyR) # Our window graphics definition 
    cv.ShowImage("window", Img) 
    (X, Y) = gazeCoordinates() # Def that uses xmlParse and average to return the averages of X and Y 
    if cv.WaitKey(20) & 0xFF == 27: 
     break 

cv2.destroyAllWindows() 

주어진 오류 코드

정의 XMLPARSE()의 xml = ET.fromstring(rxdat)-ParseError: not well-formed (invalid token) 포인트이며 결과를 인쇄하면됩니다. 그러나 창, 그래픽 및 데이터를 추가하기 시작하면 오류가 발생하기 시작합니다.

답변

2

위의 모든 텍스트를 모두 구문 분석 할 필요가 없다고 가정하면 (한꺼번에 제대로 xml되지는 않지만) 한 번에 하나의 xml 요소가 아니라 다음과 같이 해보는 것이 좋습니다. 당신은 뒤에있는 키/값 쌍을 포함하는 속성 사전으로 끝날 것입니다.

>>> import xml.etree.cElementTree as ET 
>>> xml_string = '<REC CNT="72" FPOGX="0.5065" FPOGY="0.4390" FPOGD="0.078" FPOGID="468" FPOGV="1"/>' 
>>> xml = ET.fromstring(xml_string) 
>>> xml.attrib # a dict 
{'CNT': '72', 'FPOGV': '1', 'FPOGY': '0.4390', 'FPOGX': '0.5065', 'FPOGD': '0.078', 'FPOGID': '468'} 
>>> xml.attrib['FPOGX'], xml.attrib['FPOGY'] 
('0.5065', '0.4390') 

당신은 xml.etree.ElementTree here에 대한 문서를 확인할 수 있습니다.

편집

귀하의 코멘트에 대해서는, 당신은 후 (또는 이전) XML을 포함 할 수있는 junk 주위에 코드를 순서대로 구문 분석하기 전에 XML 요소에서 문자열을 포장을 시도 할 수 있습니다. 예를 들어, (내가 처음 XML 문자열의 끝에 추가하는 "쓰레기"주)을 시도 할 수 : 파이썬이 잘 보이는 2

>>> xml_string = '<REC CNT="72" FPOGX="0.5065" FPOGY="0.4390" FPOGD="0.078" FPOGID="468" FPOGV="1"/>here is some junk that should not be here and that does not fit into xml.' 
>>> xml_string = '<data>' + xml_string + '</data>' # makes sure that the xml has an outer tag 
>>> xml = ET.fromstring(xml_string) 
>>> for element in xml: # now need to iterate through <data> tag 
    print element.attrib # a dict 
    {'CNT': '72', 'FPOGV': '1', 'FPOGY': '0.4390', 'FPOGX': '0.5065', 'FPOGD': '0.078', 'FPOGID': '468'} 
>>> xml[0].attrib['FPOGX'], xml[0].attrib['FPOGY'] # or you can find attributes by indices (like a list) 
    ('0.5065', '0.4390') 

편집 할 수 있습니다. 문제는 xml 문자열에서받는 문자 (또는 문자)입니다. 합니다 (<data></data> 요소는 괜찮습니다.)이 교체하여 어떤 토큰하는 당신에게 문제를주고있다 알아낼 수 있습니다 :이와

xml = ET.fromstring(rxdat) 

을 :

try: 
    xml = ET.fromstring(rxdat) 
except: 
    print rxdat # will print the string or strings it cannot parse 

당신의 문자 나 그룹을 탈출해야합니다 이 테스트에서 무엇을 발견했는지에 따라

+0

이 (마지막으로 가장 최근에 호출) 나에게 '역 추적을 오류를 줄 것이다 : 파일 : XML = ET.fromstring에서, 라인 (26) "C \ 사용자 제니 \ 바탕 화면 \ 팀 디자인 \ GazeXMLtest.py을 \" (rxdat) 파일 "", 줄 124, XML ParseError : 문서 요소 뒤의 junk : 줄 2, 열 0' 대부분의 경우. 때로는 완벽하게 실행되고 때로는 실행되어 나중에 오류가 발생합니다. 왜 이런 일이 일어나고 있는거야? – user3121062

+0

@ user3121062 xml을 구문 분석하기 전에 데이터 주위에 래퍼를 추가 할 수 있습니다.잠시 후 예를 들어 대답을 업데이트하겠습니다. –

+0

@ user3121062 "정크"를 잡는 데 도움이되는 답변을 업데이트했습니다. –