使用lxm分析xml时出现异常

2024-09-19 23:27:09 发布

您现在位置:Python中文网/ 问答频道 /正文

我编写这段代码是为了通过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不是空的。 有什么问题吗?在


Tags: 文件代码schemadefxmlopenetreexsd
2条回答

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

在lxml解析器完全读取内容之前,您需要将指针放回开头。使用^{} 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时,才需要这样做;或者,如果包装在StringIO对象中,则可以将其传递到.parse()方法中,以提供必要的文件对象方法:

^{pr2}$

如果您不是使用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。在

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

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

而不是:

^{pr2}$

相关问题 更多 >