异常解析使用LXML
一个XML时,我写了这个代码通过XSD异常解析使用LXML
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)
来验证我的XML文件,但是当我想验证它,我xmlinput是空的,但是我xmlContent不为空。 有什么问题?
文件中蟒蛇有一个 “当前位置”;它从文件开头(位置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
对象提供必要的文件对象的方法:如果你是使用xmlContent
为别的不
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)
,那么你不需要额外的.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。
非常感谢您的完美答案 – Pooya 2012-07-08 17:35:11
您应该使用您已经阅读XML内容:的
xmlContent = xmlinput.read()
myxml = etree.parse(xmlContent)
代替:
myxml = etree.parse(xmlinput)
误读我的错读,我发现是正确的,这个答案仍然是错误的。您无法解析字符串中的XML内容; lxml'etree.parse'会将其解释为文件名,而这会失败。 – 2012-07-08 12:20:14
供将来参考:如果您在Python中遇到异常,则会出现回溯。如果你在你的问题中包含了回溯(全部),它会使我们更容易帮助你。 – 2012-07-08 12:03:23
@MartijnPieters,但它没有任何回溯 – Pooya 2012-07-08 17:54:35
然后也没有例外;你的问题标题显示有问题。 – 2012-07-08 20:04:57