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
他の場所も必要な場合にのみ、これを行う必要があります。必要なファイルオブジェクトメソッドを提供するためにオブジェクトに.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()
)の詳細については、Python チュートリアル のファイル オブジェクトを参照してください。