3

XMLを使用して -file を解析しようとしてQXmlStreamReaderいます。次のコードでは、サンプル xml ファイルから最初のテストケースのみを取得します。

from PyQt4.QtCore import QXmlStreamReader, QFile, QIODevice

class TestcaseReader(object):
    def __init__(self, filename):
        file = QFile(filename)
        file.open(QIODevice.ReadOnly)
        self.xml = QXmlStreamReader(file)

        while not self.xml.atEnd():
            self.xml.readNext()
            if self.xml.isStartElement():
                if self.xml.name() == "Testcase":
                    self.parse_testcase()

    def parse_testcase(self):
        print("Parse Testcase")
        while self.xml.readNextStartElement():
            if self.xml.name() == "Type":
                measurement = self.xml.readElementText()
                print("Type: " + measurement)
            elif self.xml.name() == "Attributes":
                name = self.xml.attributes().value("name")
                strname = self.xml.attributes().value("strname")
                elementtype = self.xml.attributes().value("type")
                value = self.xml.attributes().value("value")
                print("Attributes: ", name, strname, elementtype, value)

if __name__ == "__main__":
    print("XML Reader")
    xml = TestcaseReader("test.xml")

ここに私のXMLファイルがあります:

<?xml version="1.0" encoding="UTF-8" ?>
<Testcases>
    <Testcase>
        <Type>Testtype1</Type>
        <Attributes name="testattr1" strname="Testattribute 1" type="float" value="1.0">
        <Attributes name="testattr2" strname="Testattribute 2" type="str" value="test">
    </Testcase> 
    <Testcase>
        <Type>Testtype2</Type>
        <Attributes name="testattr1" strname="Testattribute 1" type="float" value="2.0">
        <Attributes name="testattr2" strname="Testattribute 2" type="str" value="test">
    </Testcase>
</Testcases>

QXmlStreamReaderTestcaseからの最初のものを解析した後、それは最後にあるため、それ以上の解析を停止します。Testcasesxml ファイルからすべてのテストケースを読み取るにはどうすればよいですか?

4

1 に答える 1

2

データ QXmlStreamReader はデータを段階的に読み取るため、すべてのデータが QIODevice のバッファで利用できるわけではありません。これは、ネットワーク ソケットなどの低速デバイスからデータを読み取る場合に特に当てはまりますが、ローカル ファイルから読み取る場合にも発生する可能性があります。

QXmlStreamReader ドキュメントの「増分解析」セクションで、チャンクで到着するデータを処理する方法の詳細をお読みください。

また、あなたの XML は無効<Attributes ... />です<Attributes ...>。たとえば、最初のものの場合:

<Attributes name="testattr1" strname="Testattribute 1" type="float" value="1.0"/>

QXmlStreamReader の error()、errorString()、errorLine()、および errorColumn() は、このような問題をデバッグするために必要なすべての情報を提供するはずです。(そして、エラーをチェックして、とにかく適切に報告することをお勧めします)。

于 2012-09-18T17:15:45.677 に答える