原地址http://blog.youkuaiyun.com/yuanzhangmei1/article/details/7828672
下面这段话对我解析xml有帮助。
凡是开头加QDom前缀的都是代表节点类型。所以有,QDomElement代表一个Element节点,而QDomText代表一个Text节点。QDomNode类可以存储任意类型的节点。如果想进一步处理一个节点,首先必须把它转化为正确的数据类型。QDomNode调用toElement()以把它转化成QDomElement,然后调用tagName()来获得元素的标签名称。如果节点不是Element类型,那么toElement()函数就返回一个空QDomElement对象和一个空标签。
这个看着更清晰点,原地址http://blog.youkuaiyun.com/walker19900515/article/details/45649073
void MainWindow::parseBookindexElement(const QDomElement &element) { QDomNode child = element.firstChild(); while (!child.isNull()) { if (child.toElement().tagName() == "entry") { parseEntryElement(child.toElement(), treeWidget->invisibleRootItem()); } child = child.nextSibling(); } } |
如果根标签正确,我们取第一个子标签,判断子标签不为空,也就是存在子标签,然后再判断其名字是不是 entry。如果是,说明我们正在处理 entry 标签,则调用其自己的处理函数;否则则取下一个标签(也就是 nextSibling() 的返回值)继续判断。注意我们使用这个 if 只选择 entry 标签进行处理,其它标签直接忽略掉。另外,firstChild() 和 nextSibling() 两个函数的返回值都是 QDomNode。这是所有节点类的基类。当我们需要对节点进行操作时,我们必须将其转换成正确的子类。这个例子中我们使用 toElement() 函数将 QDomNode 转换成 QDomElement。如果转换失败,返回值将是空的 QDomElement 类型,其 tagName() 返回空字符串,if 判断失败,其实也是符合我们的要求的。