使用lxml解析xml时出现异常

时间:2012-07-08 11:51:48

标签: python xml-parsing lxml

我编写了这段代码,通过xsd

验证我的xml文件
def parseAndObjectifyXml(xmlPath, xsdPath):
    from lxml import  etree

    xsdFile = open(xsdPath)
    schema = etree.XMLSchema(file=xsdFile)
    xmlinput = open(xmlPath)
    xmlContent = xmlinput.read()
    myxml = etree.parse(xmlinput) # In this line xml input is empty
    schema.assertValid(myxml)

但是当我想验证它时,我的xmlinput是空的但我的xmlContent不是空的。 有什么问题?

2 个答案:

答案 0 :(得分:3)

python中的文件有“当前位置”;它从文件的开头(位置0)开始,然后,当您读取文件时,当前位置指针一直移动直到它到达结尾。

在lxml解析器可以完整读取内容之前,您需要将该指针放回到开头。请使用.seek() method

from lxml import  etree

def parseAndObjectifyXml(xmlPath, xsdPath):
    xsdFile = open(xsdPath)
    schema = etree.XMLSchema(file=xsdFile)
    xmlinput = open(xmlPath)
    xmlContent = xmlinput.read()
    xmlinput.seek(0)
    myxml = etree.parse(xmlinput)
    schema.assertValid(myxml)

如果您在其他地方也需要xmlContent,则只需要执行此操作;如果包含在.parse()对象中以提供必要的文件对象方法,您也可以将其传递给StringIO方法:

from lxml import  etree
from cStringIO import StringIO

def parseAndObjectifyXml(xmlPath, xsdPath):
    xsdFile = open(xsdPath)
    schema = etree.XMLSchema(file=xsdFile)
    xmlinput = open(xmlPath)
    xmlContent = xmlinput.read()
    myxml = etree.parse(StringIO(xmlContent))
    schema.assertValid(myxml)

如果您使用xmlContent进行其他任何操作,那么您也不需要额外的.read()调用,并且随后在使用lxml进行解析时也不会有问题;只是省略了调用,你不需要将当前位置指针移回到开头:

from lxml import  etree

def parseAndObjectifyXml(xmlPath, xsdPath):
    xsdFile = open(xsdPath)
    schema = etree.XMLSchema(file=xsdFile)
    xmlinput = open(xmlPath)
    myxml = etree.parse(xmlinput)
    schema.assertValid(myxml)

要详细了解.seek()(及其对应的.tell()),read up on file objects in the Python tutorial

答案 1 :(得分:-1)

您应该使用已阅读的XML内容:

xmlContent = xmlinput.read()
myxml = etree.parse(xmlContent)

而不是:

myxml = etree.parse(xmlinput)