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