使用QXmlStreamReader进行XML解析不会返回所有元素

时间:2012-09-18 16:09:24

标签: python xml qt pyqt qxmlstreamreader

我正在尝试使用XML解析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>

Testcase QXmlStreamReader解析第一个Testcases后,它返回结束,因此停止进一步解析。如何从xml文件中读取所有测试用例?

1 个答案:

答案 0 :(得分:2)

当数据QXmlStreamReader以递增方式读取数据时,并非所有数据都可能在QIODevice的缓冲区中可用。当从慢速设备读取数据时尤其如此。网络套接字,但也可以在从本地文件读取时发生。

详细了解如何处理"Incremental parsing" section of the QXmlStreamReader documentation中的数据到达的数据。

此外,您的XML无效,应该是<Attributes ... />而不是<Attributes ...>。例如,第一个:

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

QXmlStreamReader的error(),errorString(),errorLine()和errorColumn()应该为您提供调试此类问题所需的所有信息。 (并且最好检查错误并正确报告它们。)