lxml - 解析没有换行的XML

1 投票
1 回答
2148 浏览
提问于 2025-04-16 20:40

我在用Python的lxml库里的iterparse功能来遍历我的XML文件中的元素。大部分的XML文件都能正常处理,但有些文件就不行。其中一个文件没有换行符。下面是错误信息和一个这样的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 个回答

2

etree.iterparse 这个函数需要一个缓冲区作为输入参数。而你传入的变量名 "fullFilePath" 让我觉得它不是一个文件(所以解析器试图解析的是文件路径,而不是文件内容)。

试着传入一个已经打开的文件吧。

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

顺便问一下,你说的这个是什么意思呢?

def main(object):

撰写回答