У меня есть вопрос, касающийся чтения файла XML:
<table>
<100000 />
<100001 name="void" type="ref" cat="ref"/>
<100002 name="noref" type="err" cat="ref"/>
<100003 name="notype" type="err" cat="ref"/>
<100004 name="nostring" type="err" cat="ref"/>
<100005 name="noobj" type="err" cat="ref"/>
</table>
Я хочу иметь QList всех имен дочерних элементов (100000 — 100005), но не указывать значения атрибутов.
Это мой код до сих пор:
QList<QString> xmlActions::GetXMLID (QFile *XMLIndex)
{
QList<QString> xList;
if (XMLIndex->open(QIODevice::ReadOnly))
{
QXmlStreamReader reader (XMLIndex->readAll());
XMLIndex->close();
while(!reader.atEnd() && !reader.hasError())
{
QXmlStreamReader::TokenType token = reader.readNext();
if(token == QXmlStreamReader::StartElement)
{
if(reader.name().toString() == QLatin1String("table"))
{
continue;
}
xList << reader.name().toString();
}
}
}
return xList;
}
Я получаю только список empy. Если я закомментирую это:
if(reader.name().toString() == QLatin1String("table"))
{
continue;
}
единственное, что содержится в списке, это «таблица» (начальный элемент). Я думаю, это может быть довольно просто, но я не понимаю.
Файл не является допустимым XML. Имя элемента XML не может начинаться с цифры.
Цитируя официальные документы (XML 1.0, пятое издание) раздел 2.3:
[4] NameStartChar ::= ":" | [A-Z] | "_" | [a-z] | [#xC0-#xD6] | [#xD8-#xF6] | [#xF8-#x2FF] | [#x370-#x37D] | [#x37F-#x1FFF] | [#x200C-#x200D] | [#x2070-#x218F] | [#x2C00-#x2FEF] | [#x3001-#xD7FF] | [#xF900-#xFDCF] | [#xFDF0-#xFFFD] | [#x10000-#xEFFFF]
[4a] NameChar ::= NameStartChar | "-" | "." | [0-9] | #xB7 | [#x0300-#x036F] | [#x203F-#x2040]
[5] Name ::= NameStartChar (NameChar)*
поскольку QXmlStreamReader
предназначен для чтения только правильно сформированных XML-документов, технически неопределенное поведение. Читатель, вероятно, просто пытается справиться как можно лучше.