0

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は空ではありません。何が問題ですか?

4

2 に答える 2

3

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 チュートリアル のファイル オブジェクトを参照してください。

于 2012-07-08T11:55:38.273 に答える
-1

読んだ XML コンテンツを使用する必要があります。

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

それ以外の:

myxml = etree.parse(xmlinput)
于 2012-07-08T11:54:13.923 に答える