[英]Exception when parsing a xml using 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不是空的。 问题是什么?
python中的文件有一个“当前位置”; 它从文件的开头(位置0)开始,然后,当您读取文件时,当前位置指针一直移动直到它到达结尾。
在lxml解析器可以完整读取内容之前,您需要将该指针放回到开头。 使用.seek()
方法 :
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
其他地方也需要xmlContent
你只需xmlContent
; 如果包装在StringIO
对象中以提供必要的文件对象方法,您也可以将其传递给.parse()
方法:
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()
调用,随后也不会.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()
)的更多信息,请阅读Python教程中的文件对象 。
您应该使用您已阅读的XML内容:
xmlContent = xmlinput.read()
myxml = etree.parse(xmlContent)
代替:
myxml = etree.parse(xmlinput)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.