1 创建XML
1.1 新建Qt Widget应用myDom2,类名MainWindow,基类为MainWindow.
加载QXml模块,在项目文件(.pro)中添加 QT += xml
QT += xml
设置中文显示
QTextCodec::setCodecForLocale(QTextCodec::codecForLocale());1.2 生成一棵DOM树,再调用save()函数利用QTextStream文本流将DOM树保存在文件中。
//创建XML的文档对象
QDomDocument doc;
//添加处理指令,即XML说明
QDomProcessingInstruction instruction;
instruction = doc.createProcessingInstruction("xml","versiong=\"1.0\" encode=\"UTF-8\"");
doc.appendChild(instruction);
//创建文档的根元素
QDomElement root = doc.createElement(QString("书库"));
doc.appendChild(root);
//创建子元素
QDomElement book = doc.createElement(QString("图书"));
QDomAttr id=doc.createAttribute(QString("编号"));
QDomElement title = doc.createElement(QString("书名"));
QDomElement author = doc.createElement(QObject::tr("作者"));
//设置元素的值及属性的值
QDomText text;
id.setValue(QString("1"));
book.setAttributeNode(id);
text = doc.createTextNode(QString("Qt"));
title.appendChild(text);
text = doc.createTextNode(QString("shiming"));
author.appendChild(text);
//设置元素的结构
book.appendChild(title);
book.appendChild(author);
root.appendChild(book);
//打开文件
QFile file("my.xml");
if (!file.open(QIODevice::WriteOnly | QIODevice::Truncate)) return;
//构造文本流
QTextStream out(&file);
//将文本流保存到文件,4为子元素缩进的字符数
doc.save(out,4);
file.close();
1.3 查找,删除,更新
1.3.1 打开xml文件并读到内存中
//打开xml文件并读到内存中
QFile file("my.xml");
if (!file.open(QIODevice::ReadOnly)) return;
QDomDocument doc;
QString err;
int errRow;
int errCol;
if (!doc.setContent(&file,&err,&errRow,&errCol)) {
qDebug() << QString("%1,%2,%3").arg(err).arg(errRow).arg(errCol);
file.close();
return ;
}
file.close();
//获取xml中所有标签名为Book的节点的节点列表,元素继承自节点
QDomNodeList list = doc.elementsByTagName("Book");
1.3.3
//遍历找到符合条件的节点
for (int i = 0; i < list.count(); i++) {
//将节点转换成元素
QDomElement e = list.at(i).toElement();
if (e.attribute(QString("id")) == ui->leBookId->text()) {//查找条件
if ( operate == "delete" ) {
//找到根节点,通过根节点删除子节点,在写入xml文件QDomElement root = doc.documentElement();
root.removeChild(list.at(i));
QFile file("my.xml");
if (!file.open(QIODevice::WriteOnly | QIODevice::Truncate)) return;
QTextStream out(&file);
doc.save(out,4);
file.close();
ui->listWidget->clear();
ui->listWidget->addItem(QString("删除成功!delete success!"));
} else if (operate == "update") {
//
QDomNodeList child = list.at(i).childNodes();//找到title标签对应的节点,并设置值
child.at(0).toElement().firstChild().setNodeValue(ui->leBookName->text());//找到author标签对应的节点,并设置值
child.at(1).toElement().firstChild()
.setNodeValue(ui->leAuthor->text());
QFile file("my.xml");
if (!file.open(QIODevice::WriteOnly | QIODevice::Truncate)) return;
QTextStream out(&file);
doc.save(out,4);
file.close();
ui->listWidget->clear();
ui->listWidget->addItem(QString("update Sucess"));
} else if (operate == "find") {
ui->listWidget->clear();
ui->listWidget->addItem(e.tagName() + e.attribute(QString("id")));
QDomNodeList list = e.childNodes();
for (int i = 0; i < list.count(); i++) {
QDomNode node = list.at(i);
if (node.isElement())
ui->listWidget->
addItem(QString("%1:%2")
.arg(node.toElement().tagName())
.arg(node.toElement().text()));
}
}
}
}