`
w1shi2wei3
  • 浏览: 11857 次
社区版块
存档分类
最新评论

Qt中xml的读写

    博客分类:
  • QT
xml 
阅读更多
我们可以看到,如果所要读取的XML文件不是很大,采用DOM读取方法还是很便捷的,由于我用的也是DOM树读取的方法,所以,本文所介绍的也主要是基于DOM的方法读取。
(来自http://blog.sina.com.cn/s/blog_4ac0a0d30100mr53.html)
根据常用的操作,我简单的把对XML的操作分为以下几类:
1 首先对XML文件进行操作,打开文件。
这个其实就是对文件进行操作,可以把它直接定义为构造函数,在对对象进行初始化时完成。
TopoDataReader::TopoDataReader(const wstring &filePath):_filePath(filePath),_qDomDoc("mydocument"),_qFile(QString::fromStdWString(filePath))
{
if (!_qFile.open(QIODevice::ReadOnly))
{
  return;
}
if (!_qDomDoc.setContent(&_qFile))
{
  _qFile.close();
  return;
}
}
2 读取XML文件中的节点内容
假设XML文件格式如下
(1)
<switchs>
<switch snmpip=211.87.235.136 newwork=front>
</switch>
</switchs>
(2)
<ip>211.87.235.136</ip>
对于第一种情况,采用如下方法:
QDomElement docElem = _qDomDoc.documentElement();
QDomNode nodeswitch=docElem.elementsByTagName("switch ");//红色的为标签名
QDomElement elemnodeswitch=nodeswitch.toElement();
string snmpip=qPrintable(elemnodeswitch.attribute("snmpip"));//network的也是如此方法获取
对于第二种情况,采用如下方法:
直接调用text() API就可以了
string ip=qPrintable(elementnodeip.text());
但是,假设文件中有多个同样的节点,如下
<a>
<b></b>
<b></b>
</a>
这样用elementsByTagName("b")返回的就是一个childNodes()而不是一个单独的node了。
我们可以使用at()方法具体定位。
另外,我们还可以使用这样一种方法获取节点的值,假设XML文件如下
- +<switch snmpIp="192.168.120.251" network="front">
<name>前端主交换机</name>
<description />
- <ipList>
<ip>192.168.120.251</ip>
</ipList>
<rwCommunity>public@120</rwCommunity>
<workMode>true</workMode>
<workStatus>true</workStatus>
<enableAlarm>true</enableAlarm>
<snmpCount>0</snmpCount>
<memoryUtilizationRatio>50.0</memoryUtilizationRatio>
<cpuUtilizationRatio>50.0</cpuUtilizationRatio>
<port>161</port>
<snmpStatus>true</snmpStatus>
<privateName>CZ-5_FA</privateName>
<switchIndex>topLeft</switchIndex>
</switch>
我们可以先获取switch节点,然后得到其childNodes(),于是就可以使用at()方法来获取下面的每个节点了(注:从0开始)
比如说,上面的那个ip节点就是nodeswitch.childNodes().at(3)。
这样做得好处就是不用担心重复的问题,只要你确定switch节点确定对了,底下的也就一定能确定了。
3 返回某个节点下子节点的个数
这个简单,也是直接调API
QDomElement docElem = _qDomDoc.documentElement();
QDomNode nodetagname=docElem.elementsByTagName(tagname).at(0);//假设有多个tagname此处选第一个
int num=nodetagname.childNodes().size();
好了,临时想起来就这么多。以后想起来再添。

//============================================================================================================================
Qt学习之XML读写操作小结
2010年05月25日 评论(0)|浏览(315)点击查看原文
Qt学习之XML读写操作小结

在“QQ便签”项目组中我负责有关后台XML操作的实现部分,现在对在项目中用到的XML的相关操作进行简单的小结。
这几天搜集qt对XML格式文件的读写,着重于DOM这种方式,先将搜集的资料粘贴在下面, 以一个完整的流程:
=======如下:============

我们知道对XML的操作有两种方法,即DOM方式和SAX方式。二者主要区别是:DOM实现方式操作非常简单,但不适合处理过大文件;而SAX实现方式是能处理很大的XML文件,但是需要开发者写
一些复杂的代码。Qt提供了对应于这两种用于读取、操作和编写XML的实现类,分别是QDomDocument类和QXmlStreamReader类,由于在项目中涉及的文件不大,因此我们选用QDomDocument类来
处理。
项目中涉及便签的增删改查,对应于XML文件中相应标记的读、写和修改,下面分别介绍:

1. 创建节点,将其写入XML文件,主要操作包括:
QDomDocument doc;
1).创建根节点:QDomElement root = doc.documentElement("rootName " );
2).创建元素节点:QDomElement element = doc.createElement_x_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_x("Notes");
doc.appendChild(root);
QDomElement note = doc.createElement_x_x("note");
root.appendChild(note);
QDomElement no = doc.createElement_x_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_x("device3");
element.setAttribute("ChildName","Content");
QDomElement el_address = doc.createElement_x_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_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;
}
分享到:
评论

相关推荐

    基于QT实现XML文件读写操作,解析操作

    在QT中处理XML文件,可以方便地进行数据的读取、写入和解析,使得应用程序能够与XML数据进行交互。 首先,我们需要了解QT中的QDomDocument类,它是QT提供的XML解析器,可以用来加载、修改和保存XML文档。使用...

    Qt读写Xml文件(QTreeWidget加载显示Xml文件内容;QTreeWidget项导出保存为Xml)

    在本文中,我们将深入探讨如何使用Qt框架进行XML文件的读写操作,特别是在与QTreeWidget结合使用时的实现方式。QTreeWidget是Qt提供的一种用于显示和操作树型结构数据的控件,而XML是一种广泛应用的数据存储和交换...

    Qt读写Xml文件,QTreeWidget显示Xml和导出Xml文件

    通过以上步骤,我们就完成了Qt读写XML文件,使用QTreeWidget显示XML结构,并将QTreeWidget内容导出为XML文件的完整流程。这些功能在许多应用程序中都有广泛的应用,如配置文件管理、数据存储和交换等。理解并掌握...

    QT中对XML进行读写操作

    通过以上介绍,你应该对在QT中使用`QXmlStreamWriter`和`QXmlStreamReader`进行XML读写有了基本的理解。这两个工具的强大之处在于它们的灵活性和易用性,能够满足不同复杂度的XML处理需求。在实际编程中,结合QT的...

    QT xml文件的读写,增减,更新。

    在QT中,XML处理是通过QDomDocument类和相关的辅助类来实现的,这些类提供了对XML文档的读、写、增、删、改等操作。以下是对XML文件操作的详细知识点: 1. **QDomDocument**: 这是QT中的核心XML处理类,用于表示...

    Qt读写Xml文件到QTableWidget.rar

    在Qt框架中,XML文件是一种常见的数据存储格式,它具有结构化、易于解析和生成的特点。本教程将详细介绍如何在Qt应用中实现XML文件的读取与写入,并将数据展示到QTableWidget中,以及从QTableWidget中保存回XML文件...

    qt读写xml.zip

    在本案例中,"qt读写xml.zip"是一个压缩包,包含了一些利用Qt库进行XML操作的代码示例。这个压缩包提供了三个静态函数,分别用于创建XML文件、读取XML文件和写入XML文件。 首先,我们来看创建XML文件的功能。在Qt中...

    qt中xml DOC读写总结

    ### Qt中XML (DOM方式) 读写总结 #### 前言 在软件开发过程中,XML作为一种常用的数据存储和交换格式,被广泛应用于配置文件、数据交换等场景。Qt作为一个强大的跨平台C++框架,提供了多种处理XML文档的方式,其中...

    Qt之xml读写操作Demo

    这篇描述提到的"Qt之xml读写操作Demo"是一个基于Visual Studio 2019和Qt 5.15.2的示例项目,用于演示如何在Qt环境中进行XML文件的操作。 首先,要理解Qt中的XML处理,你需要了解以下几个关键类: 1. **...

    QT读取xml文件将所有节点保存到treewidget中

    首先,我们需要导入必要的QT库,包括`QtXml`和`QtWidgets`: ```cpp #include #include #include ``` 接下来,我们需要一个函数来解析XML文件并将其内容添加到`QTreeWidget`。这个函数通常会接收一个文件路径...

    Qt对XMl的读写,下载即可vs2017编译完成

    在提供的"Qt_read_write"压缩包中,你将找到一个完整的示例项目,展示如何在VS2017下使用Qt进行XML读写。这个示例可能包含了以下步骤: 1. 初始化`QFile`对象并打开XML文件。 2. 创建`QDomDocument`对象,使用`...

    QT读写XML与Sqlite.zip

    本教程将深入探讨QT如何进行XML读写以及SQLite数据库的使用。 XML(eXtensible Markup Language)是一种标记语言,用于存储和传输数据。QT提供了QDomDocument、QXmlStreamReader和QXmlStreamWriter等类来处理XML...

    基于QT封装的XML操作,显示类

    QT作为一个跨平台的C++图形用户界面应用程序框架,提供了对XML的支持,使得开发者能够方便地在QT应用程序中处理XML文档。本篇将详细介绍基于QT的QDomDocument类封装的XML操作和显示类,旨在简化XML文件的读取、修改...

    Qt实现的xml读写demo 递归

    本教程将通过一个Qt实现的XML读写示例,帮助你理解如何在Qt环境中进行XML文件的操作,特别是递归处理XML节点的方法。 首先,我们需要引入必要的Qt库,主要是`QDomDocument`,`QDomElement`和`QFile`。`QDomDocument...

    QTreeWidget读写Xml功能

    压缩包子文件的文件名称列表中提到的"QtXml"是指Qt提供的一个模块,包含对XML文档的操作支持。主要类有QDomDocument、QDomElement、QDomNode等,它们提供了解析、创建和修改XML文档的功能。 总结来说,QTreeWidget...

    【Qt】 XML流读写XML.rar

    通过以上介绍,我们对Qt中的XML流式读写有了全面的理解。无论是使用QDomDocument进行结构化处理,还是借助QXmlStreamReader和QXmlStreamWriter实现高效读写,都可以根据实际需求选择合适的工具来处理XML数据。在实际...

    Qt实现xml文件内容的遍历读出

    Qt实现xml文件内容的遍历读出,并演示了递归、虚函数的如何使用

    Qt 实现对XML的读写操作实现信息管理

    首先,Qt中的QXmlStreamReader和QXmlStreamWriter类是进行XML读写的核心工具。QXmlStreamReader用于解析XML文档,逐个读取XML元素、属性和文本,而QXmlStreamWriter则用于生成XML文档,将数据结构转换为XML格式。 1...

    qt xml操作 遍历

    通过熟练掌握QXmlStreamReader和QDomDocument,开发者可以高效地在Qt应用中处理XML数据,实现各种功能,如配置文件读写、数据交换等。在实际操作中,注意错误处理和资源管理,确保代码的稳定性和效率。

    QT读写改XML格式文件

    最近因业务需要,需要更改XML文件中某一结点的值,于是搜索相关资料,但是网上搜出来资料的没有详细解释,好不容易才搞明白,因此,将代码上传,以供各位少走弯路。本程序支持1.创建一个XML文件。2.读取一个XML文件...

Global site tag (gtag.js) - Google Analytics