用 Qt 中的 QDomDocument类 处理 XML 文件(下)

QDomDocument doc;

1).创建根节点:QDomElement root = doc.documentElement("rootName " );

2).创建元素节点:QDomElement element = doc.createElement_x("nodeName");

3).添加元素节点到根节点:root. appendChild(element);

4).创建元素文本:QDomText nodeText=doc.createTextNode("text");

5).添加元素文本到元素节点:element. appendChild(nodeText);

在本项目中,假设便签的属性有序号、名字、内容、字体、字号、颜色、粗细、斜体、下划线这几项,则在文件中添加一个便签节点的操作如下:

QDomDocument doc;

instruction = doc.createProcessingInstruction("xml","version="1.0" encoding="UTF-8"");

doc.appendChild(instruction);

QDomElement root = doc.createElement_x("Notes");

doc.appendChild(root);

QDomElement note = doc.createElement_x("note");

root.appendChild(note);

QDomElement no = doc.createElement_x("no");

note.appendChild(no);

...

...

QDomText no_text = doc.createTextNode("001");

...

...

则得到一个便签节点,将其保存到test.xml文件中,代码如下:

QFile file("test.xml");

if (!file.open(QIODevice::WriteOnly | QIODevice::Truncate |QIODevice::Text))

return ;

QTextStream out(&file);

out.setCodec("UTF-8");

doc.save(out,4,QDomNode::EncodingFromTextStream);

file.close();

则test.xml文件:

<?xml version="1.0" encoding="UTF-8"?>

<Notes>

<note>

<no>001</no>

<name>2010-05-10(13:53:24)</name>

<content>A meeting!</content>

<font>Script MT Bold</font>

<fontSize>16</fontSize>

<color> #00ffff</color>

<weight>0</weight>

<fontItalic>true</fontItalic>

<fontUnderline>true</fontUnderline>

</note>

</Notes>

上面是创建一个便签节点,若要继续添加便签节点,则需要在已有节点后增加一个新节点,并重写入XML文件。

2. 加载、查找便签时要读取XML文档中的节点信息,DOM实现方式是将整个文档当作一个对象来装入内存进行处理,然后开发者可以访问这个对象中的每一个节点,每一个节点对应XML文件里

的一个标记。

主要操作包括:

1).读取根节点:QDomElement root = doc.documentElement();

2).读取第一个子节点:QDomNode node = root.firstChild();

3).读取下一个子节点:node = node.nextSibling();

4).匹配结点标记:node.toElement().tagName() == "note"

5).读取节点文本:no = childNode.toText().data();
//========================遍历节点================
可以通过doc.childNodes()获得doc的所有的子节点列表QDomNodeList。比如

QDomNodeList list=doc.childNodes();

for(int i=0;i<list.count();i++){

QDomNode node=list.at(i);//好的风格当然是把定义写在外面:(

//qDebug()<<”node name is “<<node.nodeName();

//qDebug()<<”node type is “<<.nodeType();

}
//==============================================

以下是项目中读取便签属性的函数实现代码:

void MainWindow::parseAttr(const QDomElement &element)

{

QString no,name,content,font,fontSize,color;

QDomNode node = element.firstChild();

while (!node.isNull()) {

if (node.toElement().tagName() == "note") {//匹配note节点

parseAttr(node.toElement());

} else if (node.toElement().tagName() == "no") {//匹配属性no

QDomNode childNode = node.firstChild();

if (childNode.nodeType() == QDomNode::TextNode) {

no = childNode.toText().data();

}

}

else if (node.toElement().tagName() == "name") //匹配属性name

...

...

node = node.nextSibling();//读取兄弟节点

}

}

3. 删除便签时,要删除相应的XML节点,用到的主要函数为:root.removeChild(node); 但在删除某个节点后要重写整个文件。

以上对XML文件的重写操作是必须的,因此在文件的打开方式中要加上QIODevice::Truncate,表示覆盖重写。目前还没有找到可以直接修改文件的方法,但若文件很大的情况下,必须考虑相

应的效率问题。

由于本项目在启动时需要将所有便签加载到内存,因此选用DOM方式比较合适,但如果处理的XML文件很大,而且不需要全部读到内存时,可以用SAX实现方式,它按阶段将文档读取到内存中,

在碰到标签或者其它阶段的时候,可以调用开发者预先设计好的回调函数去处理,这样效率比DOM方式更高。

4.读取XML文件内容:
//===================打开document===============add me ======
 QString xmlPath = "filename.xml";
 QFile file(xmlPath);
 if (!file.open(QFile::ReadOnly | QFile::Text))
  return ;

QString errorStr;
 int errorLine;
 int errorColumn;

QDomDocument doc;
 if (!doc.setContent(&file, false, &errorStr, &errorLine, &errorColumn))
  return ;
 file.close();
//也可以用doc.setContent(&file)带一个参数就行。
//=============================================================

然后按照上面方式遍历数据,修改后在以上面相同的方式写入到XML文件中。

//=========================================附加一段代码 创建XML文件===============
int main( int argc, char **argv )
{
 QApplication a( argc, argv );

QString xmlPath = "InitInfo.xml";
 QFile file(xmlPath);
 if (!file.open(QFile::ReadOnly | QFile::Text))
  return 1;
 QString errorStr;
 int errorLine;
 int errorColumn;
 QDomDocument doc;
 if (!doc.setContent(&file, false, &errorStr, &errorLine, &errorColumn))
  return 1;
 file.close();

QDomElement root = doc.documentElement();
 QString str = root.tagName();
 if (root.tagName() != "Root")
  return 1;

QDomElement element =  doc.createElement_x("device3");
 element.setAttribute("ChildName","Content");
 QDomElement el_address = doc.createElement_x("Content ");
 el_address.setAttribute("key","equipmentname");
 el_address.setAttribute("value","CSC101B");
 el_address.setAttribute("name","装置名称");
 //QDomText text_address = doc.createTextNode("key");
 //el_address.appendChild(text_address);

element.appendChild(el_address);
 QDomElement el_path = doc.createElement_x("path");
 QDomText text_path = doc.createTextNode("aa");
 el_path.appendChild(text_path);
 element.appendChild(el_path);
 root.appendChild(element);
 QFile f(xmlPath);
 if (!f.open(QFile::WriteOnly | QFile::Text))
  return 1;
 QTextStream out(&f);
 QTextCodec * codec = QTextCodec::codecForName("GBK");
 out.setCodec(codec);
 QDomDocument xmlDoc;
 QString strHead("version="1.0" encoding="GB2312"");
 xmlDoc.appendChild(xmlDoc.createProcessingInstruction("xml", strHead));
 out<<xmlDoc.toString();
 root.save(out, 3);
 f.close();

return 0;
}

时间: 2024-10-24 11:53:45

用 Qt 中的 QDomDocument类 处理 XML 文件(下)的相关文章

用 Qt 中的 QDomDocument类 处理 XML 文件(上)

我们可以看到,如果所要读取的XML文件不是很大,采用DOM读取方法还是很便捷的,由于我用的也是DOM树读取的方法,所以,本文所介绍的也主要是基于DOM的方法读取. 根据常用的操作,我简单的把对XML的操作分为以下几类: 1 首先对XML文件进行操作,打开文件. 这个其实就是对文件进行操作,可以把它直接定义为构造函数,在对对象进行初始化时完成. TopoDataReader::TopoDataReader(const wstring &filePath):_filePath(filePath),_

Qt 中一些常用类中文说明

Qt 中一些常用类中文说明是本文讲述的内容,这篇文章主要是介绍Qt 当中经常使用的类,采取的是使用字母索引的方式,下面的类是被经常使用的. QDataStream 为QIODevice提供了一串的二进制的数据 QDataWidgetMapper 提供了从数据模型到部件的映射 QData 日期的功能 QDateEdit 提供了日期的部件用来编辑日期,是基于QDateTimeEdit 部件 QDateTime 提供日期与时间的功能 QDateTimeEdit 提供了编辑日期与实践的部件 QDBusA

第十一课、Qt中的字符串类

一.历史遗留的问题及解决方案 1.遗留的问题 (1).C语言不支持真正意义上的字符串 (2).C语言用字符数组和一组函数实现字符串操作 (3).C语言不支持自定义类型,因此无法获得字符串类型 2.解决方案 (1).从c到c++进化过程中引入了自定义类型 (2).在c++中可以通过类来完成字符串的定义 3.标准库STL (1).STL是意义上需要与c++一同发布的标准库 (2).STL是一套以模板技术完成的c++类库 (3).STL包含了常用的算法和数据结构 (4).STL包含了字符串类 4.Qt

QT开发(四十一)——XML文件解析基础

QT开发(四十一)--XML文件解析基础 一.XML文档简介 XML(Extensible Markup Language,可扩展标记语言),是一种通用的文本格式,被广泛运用于数据交换和数据存储,而不是显示数据.XML的标签没有被预定义,用户需要在使用时自行进行定义.XML是W3C(万维网联盟)的推荐标准.相对于数据库表格的二维表示,XML使用的树形结构更能表现出数据的包含关系,作为一种文本文件格式,XML简单明了的特性使得它在信息存储和描述领域非常流行. <?xml version="1

阿里面试题:Mybatis中的Dao接口和XML文件里的SQL是如何建立关系的?

一.解析XML首先,Mybatis在初始化SqlSessionFactoryBean的时候,找到mapperLocations路径去解析里面所有的XML文件,这里我们重点关注两部分.1.创建SqlSourceMybatis会把每个SQL标签封装成SqlSource对象.然后根据SQL语句的不同,又分为动态SQL和静态SQL.其中,静态SQL包含一段String类型的sql语句:而动态SQL则是由一个个SqlNode组成. 假如我们有这样一个SQL: <select id="getUserB

简单实体类和xml文件的相互转换

最近写一个题目,要求将一组员工实体类转换成xml文件,或将xml文件转换成一组实体类.题目不难,但写完感觉可以利用泛型和反射将任意一个实体类和xml文件进行转换.于是今天下午立马动手 试了下,做了个简单的模型,可以将简单的实体类和xml文件进行相互转换,但对实体类的属性类型有限制,目前只支持String, Integer, Double三种类型.但是后面可以扩展. 我的大概思路是这样的,只要能拿到实体类的类型信息,我就能拿到实体类的全部字段名称和类型,拼属性的set和get方法更是简单明了,这时

如何将数据库中的表导成XML文件

1.现将数据库中的信息读到DataTable中 2.用函数将DataTable转为string private string ConvertDataTableToXML(DataTable dt) { if (dt != null) { MemoryStream ms = null; XmlTextWriter XmlWt = null; try { ms = new MemoryStream(); XmlWt = new XmlTextWriter(ms, Encoding.Unicode);

QT中的QQueue类、C++中的queue类

C++中的queue 实现一种先进先出的数据结构,是一个模板类 头文件 #include<queue> queue<int> Q; //定义一个int型队列 Q.empty(); //返回队列是否为空 Q.size(); //返回当前队列长度 Q.front(); //返回当前队列的第一个元素 Q.back(); //返回当前队列的最后一个元素 Q.push(); //在队列后面插入一个元素, 比如插入数字5: Q.push(5) Q.pop(); //从当前队列里,移出第一个元素

在java项目中怎样利用Dom4j解析XML文件获取数据

在曾经的学习.net时常常会遇到利用配置文件来解决项目中一些须要常常变换的数据.比方数据库的连接字符串儿等.这个时候在读取配置文件的时候.我们一般会用到一个雷configuration,通过这个类来进行直接读取,能够说这是程序中直接封装好的,包含配置文件里书写的格式等等.那么,假设.想要在配置文件里写一些其它的数据,直接以XML文件的格式进行书写.这个时候在后台怎样读取XML文件里的数据呢?这里利用Dom4j来解析XML文件里连接oracle数据库的xml数据. 在使用之前,首先要在自己的项目中