El análisis XML usando QXmlStreamReader no devuelve todos los elementos

Estoy tratando de analizar XML-archivo usando QXmlStreamReader. Con el siguiente código, solo obtengo el primer caso de prueba del archivo xml de muestra.

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")

Aquí está mi archivo 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>

Después de analizar la primera Testcase del Testcases QXmlStreamReader devuelve que está al final y, por lo tanto, detiene el análisis adicional. ¿Cómo puedo leer todos los casos de prueba del archivo xml?

preguntado el 18 de septiembre de 12 a las 17:09

Como ya señaló Frank Osterfeld, el XML no es válido. Cuando tenga problemas para analizar XML, lo primero que debe hacer es verificar si la entrada es válida. Para esta entrada, este validador da 4 errores y 2 advertencias. -

1 Respuestas

Como el QXmlStreamReader de datos lee los datos de forma incremental, es posible que no todos los datos estén disponibles en el búfer de QIODevice. Ese es particularmente el caso cuando se leen datos de un dispositivo lento, por ejemplo, un enchufe de red, pero también puede ocurrir cuando se leen archivos locales.

Obtenga más información sobre cómo manejar los datos que llegan en fragmentos que en el Sección "Análisis incremental" de la documentación de QXmlStreamReader.

Además, su XML no es válido, debería leer <Attributes ... /> en lugar de <Attributes ...>. Por ejemplo, para el primero:

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

Los errores (), errorString (), errorLine () y errorColumn () de QXmlStreamReader deberían brindarle toda la información necesaria para depurar tales problemas. (y es una buena práctica verificar errores e informarlos adecuadamente de todos modos).

Respondido el 19 de Septiembre de 12 a las 08:09

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.