Синтаксический анализ XML с использованием 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
от Testcases
QXmlStreamReader возвращает его в конце и поэтому останавливает дальнейший анализ. Как я могу прочитать все тестовые случаи из файла XML?
1 ответ
Поскольку данные QXmlStreamReader считывают данные постепенно, не все данные могут быть доступны в буфере QIODevice. Это особенно верно при чтении данных с медленного устройства, например, сетевого сокета, но также может происходить при чтении из локальных файлов.
Узнайте больше о том, как обрабатывать данные, поступающие в виде блоков, в разделе "Инкрементный анализ" в документации QXmlStreamReader.
Кроме того, ваш XML недействителен, он должен читать <Attributes ... />
вместо <Attributes ...>
, Например, для первого:
<Attributes name="testattr1" strname="Testattribute 1" type="float" value="1.0"/>
В QXmlStreamReader error(), errorString(), errorLine() и errorColumn() должны предоставить вам всю информацию, необходимую для устранения таких проблем. (и в любом случае рекомендуется проверять ошибки и правильно сообщать о них).