В настоящее время я изо всех сил пытаюсь разобрать 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
nodeType == QDomNode::NodeType
устанавливается только на самый внутренний узел. Это требуется спецификацией DOM:
Текстовый интерфейс представляет текстовое содержимое (обозначается как символ
данные в XML) элемента или Attr. Если нет разметки внутри
содержимое элемента, текст содержится в одном объекте
реализация интерфейса 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();
}
Других решений пока нет …