2011-07-01 3 views
0

python에서 lxml iterparse를 사용하여 XML 파일의 요소를 반복합니다. 대부분의 xml에서는 잘 작동하지만 일부에서는 실패합니다. 그들 중 하나는 줄 바꿈이 없습니다. 오류 및 해당 XML의 샘플은 다음과 같습니다. 모든 단서?lxml - 줄 바꿈없이 xml 구문 분석

감사합니다.

<root><person><name>"xyz"</name><age>"10"</age></person><person><name>"abc"</name><age>"20"</age></person></root> 

오류 -

XMLSyntaxError: Document is empty, line 1, column 1 

코드 -

from lxml import etree 

def parseXml(context,elemList):   
    for event, element in context:   
     if element.tag in elemList:     
      #read text and attributes is any 
     element.clear() 

def main(object): 
    elemList= ['name','age','id']  
    context=etree.iterparse(fullFilePath, events=("start","end"))  
    parseXml(context,elemList) 
+1

코드는? –

+0

코드 샘플을 추가했습니다. – Rinks

답변

2

etree.iterparse 소스 인수에 대한 버퍼를 기대하고있다. 그리고 전달하는 변수의 이름 인 "fullFilePath"는 그것이 파일이 아니라는 것을 알려줍니다 (파서가 파일 내용의 file_path를 구문 분석하려고합니다). 열린 파일을 대신 전달하십시오.

context=etree.iterparse(open(fullFilePath), events=("start","end")) 

또는 문자열 :

from lxml import etree 

xml = '<root><person><name>"xyz"</name><age>"10"</age></person><person><name>"abc"</name><age>"20"</age></person></root>\n' 

def parseXml(context,elemList): 
    for event, element in context: 
     if element.tag in elemList: 
      print element.tag, 
     element.clear() 

def main(): 
    elemList= ['name','age','id'] 
    context=etree.iterparse(StringIO(xml), events=("start","end")) 
    parseXml(context,elemList) 

main() 

>>>name name age age name name age age 

PS : 그리고이 뜻 할까?

데프 주 (객체) :

+0

답장을 보내 주셔서 감사합니다 @ 필. 실제로 fullFilePath와 open (fullFilePath)이 모두 작동합니다. 불행히도 xml 파일 자체에는 오류가 있습니다. 그리고 나는 일련의 파일을 가지고 있기 때문에 올바른 파일 형식을 열어서 확인했다. (오류는 다음 파일에 있었지만) 파서가 잘못되었다고 생각했다. – Rinks