异常解析使用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不为空。 有什么问题?

+2

供将来参考:如果您在Python中遇到异常,则会出现回溯。如果你在你的问题中包含了回溯(全部),它会使我们更容易帮助你。 – 2012-07-08 12:03:23

+0

@MartijnPieters,但它没有任何回溯 – Pooya 2012-07-08 17:54:35

+0

然后也没有例外;你的问题标题显示有问题。 – 2012-07-08 20:04:57

文件中蟒蛇有一个 “当前位置”;它从文件开头(位置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

+0

非常感谢您的完美答案 – Pooya 2012-07-08 17:35:11

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

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

代替:

myxml = etree.parse(xmlinput) 
+0

误读我的错读,我发现是正确的,这个答案仍然是错误的。您无法解析字符串中的XML内容; lxml'etree.parse'会将其解释为文件名,而这会失败。 – 2012-07-08 12:20:14