QDomElement не может определить правильный nodeType

В настоящее время я изо всех сил пытаюсь разобрать XML-документы, потому что QDomElement, похоже, не может определить правильный nodeType.

Мой XML-документ имеет следующее содержимое:

<?xml version="1.0" encoding="UTF-8"?>
<note>
  <to>Tove</to>
  <from>
    <me>Jani</me>
  </from>
  <heading>Reminder</heading>
  <body>Don't forget me this weekend!</body>
</note>

Код для чтения в документе следующий:

QFile xmlFile("note.xml");

if (!xmlFile.open(QIODevice::ReadOnly)) {
     qDebug() << "error while opening file";
}

QDomDocument xmlDoc;
if (!xmlDoc.setContent(&xmlFile)) {
    qDebug() << "error while setting xml content";
}

QDomElement rootElement = xmlDoc.documentElement();
QDomElement firstLevel = rootElement.firstChildElement();

while (!firstLevel.isNull()) {
    qDebug() << firstLevel.tagName() << firstLevel.text() << firstLevel.nodeType();
    firstLevel = firstLevel.nextSiblingElement();
}

xmlFile.close();

Моя проблема в том, что даже если он содержит только текстовые элементы, я всегда получаю QDomNode :: ElementNode при вызове firstLevel.nodeType(). Но для синтаксического анализа важно знать правильный nodeType. Что мне нужно сделать, чтобы получить настоящий тип?

С уважением, Frogtime


person Frogtime    schedule 11.03.2017    source источник


Ответы (1)


nodeType == QDomNode::NodeType устанавливается только на самый внутренний узел. Это требуется спецификацией DOM:

Интерфейс Text представляет текстовое содержимое (называемое символьными данными в XML) элемента или атрибута. Если внутри содержимого элемента нет разметки, текст содержится в одном объекте, реализующем интерфейс Text, который является единственным дочерним элементом элемента. Если есть разметка, она разбирается на список элементов и текстовые узлы, которые формируют список дочерних элементов элемента.

Чтобы прояснить это, взгляните на этот слегка измененный код:

while (!firstLevel.isNull()) {
    qDebug() << firstLevel.tagName() << firstLevel.text() << firstLevel.nodeType();
    QDomNode firstNode = firstLevel.firstChild();
    qDebug() << "And the child has nodetype:" << firstNode.nodeType();
    firstLevel = firstLevel.nextSiblingElement();
}
person Jens    schedule 13.03.2017