<p>python中的文件有一个“current position”;它从文件的开头开始(位置0),然后,当您读取文件时,当前位置指针会一直移动,直到它到达末尾。在</p>
<p>在lxml解析器完全读取内容之前,您需要将指针放回开头。使用<a href="http://docs.python.org/library/stdtypes.html#file.seek" rel="nofollow">^{<cd1>} method</a>来实现:</p>
<pre><code>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)
</code></pre>
<p>只有当您还需要<code>xmlContent</code>时,才需要这样做;或者,如果包装在<code>StringIO</code>对象中,则可以将其传递到<code>.parse()</code>方法中,以提供必要的文件对象方法:</p>
^{pr2}$
<p>如果您不是使用<code>xmlContent</code>来做其他事情,那么您也不需要额外的<code>.read()</code>调用,并且随后用lxml解析它也不会有问题;只需完全忽略该调用,也不需要将当前位置指针移回起始位置:</p>
<pre><code>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)
</code></pre>
<p>要了解更多关于<code>.seek()</code>(以及它的对应物,<code>.tell()</code>),<a href="http://docs.python.org/tutorial/inputoutput.html#methods-of-file-objects" rel="nofollow">read up on file objects in the Python tutorial</a>。在</p>