2023年12月3日发(作者:)
XML读写操作小结
我们知道对XML的操作有两种方法,即DOM方式和SAX方式。二者主要区别是:DOM实现方式操作非常简单,但不适合处理过大文件;而SAX实现方式是能处理很大的XML文件,但是需要开发者写一些复杂的代码。Qt提供了对应于这两种用于读取、操作和编写XML的实现类,分别是QDomDocument类和QXmlStreamReader类,由于在项目中涉及的文件不大,因此我们选用QDomDocument类来处理。
项目中涉及便签的增删改查,对应于XML文件中相应标记的读、写和修改,下面分别介绍:
1. 创建节点,将其写入XML文件,主要操作包括:
1).创建根节点:QDomElement root = ntElement("rootName " );
2).创建元素节点:QDomElement element = Element("nodeName");
3).添加元素节点到根节点:root. appendChild(element);
4).创建元素文本:QDomText nodeText=TextNode("text");
5).添加元素文本到元素节点:element. appendChild(nodeText);
在本项目中,假设便签的属性有序号、名字、内容、字体、字号、颜色、粗细、斜体、下划线这几项,则在文件中添加一个便签节点的操作如下:
QDomDocument doc;
instruction = ProcessingInstruction("xml","version="1.0" encoding="UTF-8"");
Child(instruction);
QDomElement root = Element("Notes");
Child(root);
QDomElement note = Element("note");
Child(note);
QDomElement no = Element("no");
Child(no);
...
...
QDomText no_text = TextNode("001");
...
...
则得到一个便签节点,将其保存到文件中,代码如下:
QFile file("");
if (!(QIODevice::WriteOnly | QIODevice::Truncate |QIODevice::Text))
return ;
QTextStream out(&file);
ec("UTF-8");
(out,4,QDomNode::EncodingFromTextStream);
();
则文件:
Script MT Bold
上面是创建一个便签节点,若要继续添加便签节点,则需要在已有节点后增加一个新节点,并重写入XML文件。
2. 加载、查找便签时要读取XML文档中的节点信息,DOM实现方式是将整个文档当作一个对象来装入内存进行处理,然后开发者可以访问这个对象中的每一个节点,每一个节点对应XML文件里的一个标记。
主要操作包括:
1).读取根节点:QDomElement root = ntElement();
2).读取第一个子节点:QDomNode node = hild();
3).读取下一个子节点:node = bling();
4).匹配结点标记:ent().tagName() == "note"
5).读取节点文本:no = ().data();
以下是项目中读取便签属性的函数实现代码:
void MainWindow::parseAttr(const QDomElement &element)
{
QString no,name,content,font,fontSize,color;
QDomNode node = hild();
while (!()) {
if (ent().tagName() == "note") {//匹配note节点
parseAttr(ent());
} else if (ent().tagName() == "no") {//匹配属性no
QDomNode childNode = hild();
if (pe() == QDomNode::TextNode) {
no = ().data();
}
}
else if (ent().tagName() == "name") //匹配属性name
...
...
node = bling();//读取兄弟节点 }
}
3. 删除便签时,要删除相应的XML节点,用到的主要函数为:Child(node); 但在删除某个节点后要重写整个文件。
以上对XML文件的重写操作是必须的,因此在文件的打开方式中要加上QIODevice::Truncate,表示覆盖重写。目前还没有找到可以直接修改文件的方法,但若文件很大的情况下,必须考虑相应的效率问题。


发布评论