(同流处理)声明
QT += core gui xml
方法:
public:
MainWindow(QWidget *parent = 0);
~MainWindow();
bool readFile(const QString &fileName);
private:
void parseBookindexElement(const QDomElement &element);
void parseEntryElement(const QDomElement &element, QTreeWidgetItem *parent);
void parsePageElement(const QDomElement &element, QTreeWidgetItem *parent);
QTreeWidget *treeWidget;
读取文件放入内存中
1.QDomDocument::setContent()方法 声明dom 将文档数据放入内存中
2.获取根节点 QDomElement root = doc.documentElement();
3.进入bookindex方法
bool MainWindow::readFile(const QString &fileName)
{
QFile file(fileName);
if (!file.open(QFile::ReadOnly | QFile::Text)) {
QMessageBox::critical(this, tr("Error"),tr("Cannot read file %1").arg(fileName));
return false;
}
QString errorStr;
int errorLine;
int errorColumn;
//重写QDomDocument::setContent()方法 声明dom 将文档数据放入内存中
//第一个是QByteArray,也就是所读取的真实数据,由QIODevice即可获得这个数据,QFile是QIODevice的子类,即Qfile读取数据
//第二个参数确定是否处理命名空间,如果设置为 true,处理器会自动设置标签的前缀之类,因为我们的 XML 文档没有命名空间,所以直接设置为 false
//剩下的三个参数都是关于错误处理。后三个参数都是输出参数,我们传入一个指针,函数会设置指针的实际值,以便我们在外面获取并进行进一步处理。
QDomDocument doc;
if (!doc.setContent(&file, false, &errorStr, &errorLine,&errorColumn)) {
QMessageBox::critical(this, tr("Error"), tr("Parse error at line %1, column %2: %3")
.arg(errorLine).arg(errorColumn).arg(errorStr));
return false;
}
//获取根节点
QDomElement root = doc.documentElement();
//根节点标签名
if (root.tagName() != "bookindex") {
QMessageBox::critical(this, tr("Error"),tr("Not a bookindex file"));
return false;
}
parseBookindexElement(root);
return true;
}
parseBookindexElement方法
void MainWindow::parseBookindexElement(const QDomElement &element)
{
//取第一个子节点(父节点为bookindex)
QDomNode child = element.firstChild();
//子节点不为空.
while (!child.isNull()) {
//判断子节点child是否为entry
if (child.toElement().tagName() == "entry") {
parseEntryElement(child.toElement(),
treeWidget->invisibleRootItem());
}
//QDomNode::nextSibling() 指向下一个child
child = child.nextSibling();
}
}
parseEntryElement方法
void MainWindow::parseEntryElement(const QDomElement &element,
QTreeWidgetItem *parent)
{
QTreeWidgetItem *item = new QTreeWidgetItem(parent);
//QString QDomElement::attribute(const QString &name,
// const QString &defValue = QString()) const
item->setText(0, element.attribute("term"));
//此时element为entry
QDomNode child = element.firstChild();
//判断child不为空
while (!child.isNull()) {
if (child.toElement().tagName() == "entry") {
parseEntryElement(child.toElement(), item);
} else if (child.toElement().tagName() == "page") {
parsePageElement(child.toElement(), item);
}
child = child.nextSibling();
}
}
parsePageElement方法
void MainWindow::parsePageElement(const QDomElement &element,
QTreeWidgetItem *parent)
{
//此时element为page 获取element文本
QString page = element.text();
//设置TreewidgetItem文本
QString allPages = parent->text(1);
if (!allPages.isEmpty()) {
allPages += ", ";
}
allPages += page;
parent->setText(1, allPages);
}