У меня возникли проблемы с обнаружением пустых элементов с помощью Qt QXmlStreamReader (Qt 4.8.1). Существует файл XML со следующим разделом
<Groups Number="4">
<Group Id="0" GroupName="Chambers">
<MemberChannels>4,5,6,7,8,9,10,11</MemberChannels>
<AverageShown>true</AverageShown>
</Group>
<Group Id="1" GroupName="Fluids">
<MemberChannels>0,1,17,18</MemberChannels>
<AverageShown>false</AverageShown>
</Group>
<Group Id="2"/>
<Group Id="3"/>
</Groups>
Как видите, элементы с идентификаторами 2 и 3 пусты, кроме атрибута. Атрибут ничего не меняет. Если дело не в элементе, проблема все равно возникает.
Это код парсинга с использованием QXmlStreamReader, я его упростил, поэтому он может не скомпилироваться. Просто вы поняли основную идею.
[...]
QXmlStreamReader* m_poStreamReader = new QXmlStreamReader;
[...]
if(m_poStreamReader->readNextStartElement() && m_poStreamReader->name().toString() == "Group") {
this->parseGroupElement();
}
[...]
bool CTempscanXmlParser::parseGroupElement( void ) {
TGroupElement tElement;
if(m_poStreamReader->isStartElement() && !m_poStreamReader->isEndElement()) { // not empty
TGroupElement tElement = this->readGroupElement();
} else if(m_poStreamReader->isStartElement() && m_poStreamReader->isEndElement()) { // empty
tElement.oGroupName = QString::null;
}
[...]
}
В документации говорится:
О пустых элементах также сообщается как StartElement, за которым непосредственно следует EndElement.
Я могу использовать readNext() и все равно не получить конечный элемент. Похоже, что парсер способен обнаружить только
<tag></tag>
как пустой элемент, но не
<tag/>
Итак, это только у меня или проблема существует в Qt? И если да, то как я могу обнаружить пустые элементы, которые не состоят из двух отдельных элементов (начало/конец)?
Редактировать: Хьютард попросил меня привести рабочий пример. Но его ответ привел меня к решению, которое почти ответило на мой вопрос. Поэтому я привожу разъясненный пример в своем ответе.