关于XML及其使用场景不在此多做介绍,今天主要介绍Qt中对于XML的解析。QtXml模块提供了一个读写XML文件的流,解析方法包含DOM和SAX,两者的区别是什么呢?  DOM(Document Object Model):将XML文件保存为树的形式,操作简单,便于访问。SAX(Simple API for XML):接近于底层,速度较快,但不便于访问。

建议阅读:http://www.devbean.net/2013/08/qt-study-road-2-read-xml-with-dom/  这篇博客,最好做一下试验!

因为下vs2013下开发Qt有些库需要手动添加!!!QXml,QSql,,

一般出现这个问题都是库文件没有添加造成,这里使用QtNetwork就要加QtNetwork的库文件,在debug模式下需要加Qt5Networkd.lib库文件,在release模式下需要加QtNetwork5.lib库文件在哪里添加呢,一共有两个地方需要添加,缺一不可

1. 项目->属性->c/c++->常规->附加包含目录->在弹出的对话框中,点那个文件夹形状的按钮添加新行,输入$(QTDIR)\include\QtNetwork

2. 项目->属性->连接器->输入->附加依赖项,添加 Qt5Networkd.lib(debug模式)或者 Qt5Network.lib(release模式)

 
person.xml文件如下所示:
解析方法:

void ParseXML::parse(QString file_name)
{
if(file_name.isEmpty())
return; QFile file(file_name);
if(!file.open(QFile::ReadOnly | QFile::Text))
{
QMessageBox::information(NULL, QString("title"), QString("open error!")); return;
} QDomDocument document;
QString error;
int row = , column = ;
if(!document.setContent(&file, false, &error, &row, &column))
{
QMessageBox::information(NULL, QString("title"), QString("parse file failed at line row and column") + QString::number(row, ) + QString(",") + QString::number(column, )); return;
} if(document.isNull())
{
QMessageBox::information(NULL, QString("title"), QString("document is null!")); return;
} QDomElement root = document.documentElement(); //root_tag_name为persons
QString root_tag_name = root.tagName();
if(root.hasAttribute("name"))
{
//name为Qt
QString name = root.attributeNode("name").value();
} //获取id="1"的节点
QDomElement person = root.firstChildElement();
if(person.isNull())
return; QString person_tag_name = person.tagName(); //id为1
QString id = person.attributeNode("id").value(); //获取子节点,数目为2
QDomNodeList list = root.childNodes();
int count = list.count();
for(int i=; i
{
QDomNode dom_node = list.item(i);
QDomElement element = dom_node.toElement(); //获取id值,等价
QString id_1 = element.attributeNode("id").value();
QString id_2 = element.attribute("id"); //获取子节点,数目为4,包括:name、age、email、website
QDomNodeList child_list = element.childNodes();
int child_count = child_list.count();
for(int j=; j
{
QDomNode child_dom_node = child_list.item(j);
QDomElement child_element = child_dom_node.toElement();
QString child_tag_name = child_element.tagName();
QString child__tag_value = child_element.text();
}
} //按照name、age、email、website的顺序获取值
QDomElement element = person.firstChildElement();
while(!element.isNull())
{
QString tag_name = element.tagName();
QString tag_value = element.text();
element = element.nextSiblingElement();
}
}

XML文件如下所示:

<?xml version="1.0" encoding="GBK"?>
<Catalog name = "树形目录">
        <View id = "default">
                <任务年度/>
                <任务编号/>
                <任务名称/>
    </View>
        <View id = "1">
                <任务名称/>
                <任务年度/>
                <任务编号/>
    </View>
        <View id = "2">
                <任务年度/>
                <任务名称/>
                <任务编号/>
        </View>
</Catalog>

  读文件:

if("" == fileName)
{
qDebug()<<"Filename is Null";
return;
}
QFile file(DirectorOf("xml").absoluteFilePath(fileName));
if(!file.open(QFile::ReadOnly | QFile::Text))
qDebug()<<"open file"<<fileName<<"failed, error:"<<file.errorString();
/*解析Dom节点*/
QDomDocument document;
QString strError;
int errLin = , errCol = ;
if( !document.setContent(&file, false, &strError, &errLin, &errCol) ) {
qDebug()<<"parse file failed at line"<<errLin<<",column"<<errCol<<","<<strError;
return;
} if( document.isNull() ) {
qDebug()<<"document is null !";
return;
} QDomElement root = document.documentElement();
qDebug()<<root.tagName(); QDomElement catalogs = root.firstChildElement();
if( catalogs.isNull() )
return;
else
qDebug()<<catalogs.tagName();
while(!catalogs.isNull())
{
QString tag = catalogs.attributeNode("id").value();
QStringList child;
QPair<QString,QStringList> pair;
for(int i = ;i < catalogs.childNodes().size();i++)
child<<catalogs.childNodes().at(i).nodeName();
pair.first = tag;
pair.second = child;
catalogList.append(pair);
catalogs = catalogs.nextSiblingElement();
}
file.close();

写入XML

QFile file(DirectorOf("xml").absoluteFilePath(xmlName));
if (!file.open(QFile::ReadOnly | QFile::Text))
return false;
QString errorStr;
int errorLine;
int errorColumn;
QDomDocument doc;
if (!doc.setContent(&file, false, &errorStr, &errorLine, &errorColumn))
return false;
file.close();
QDomElement root = doc.documentElement();
if(root.tagName() != "Catalog")
return false;
QDomElement element = doc.createElement("View");
QDomAttr idAttr = doc.createAttribute("id");
element.setAttributeNode(idAttr);
element.setAttribute("id",typeName);
for(int i = 0;i < catalogs.size();i++)
{
QDomElement cataItem = doc.createElement(catalogs.at(i));
element.appendChild(cataItem);
}
root.appendChild(element);
/* QDomProcessingInstruction instruction;
instruction = doc.createProcessingInstruction("xml","version=\"1.0\" encoding=\"GBK\"");
doc.appendChild(instruction);*/
QFile f(DirectorOf("xml").absoluteFilePath(xmlName));
if(!f.open(QFile::WriteOnly | QFile::Text))
return false;
QTextStream out(&f);
doc.save(out,4);
f.close();
return true;
 

初识---Qt解析XML文件(QDomDocument)的更多相关文章

  1. Qt解析XML文件(QXmlStreamReader)

    (2013-08-03 10:53:53) 转载▼       如何使用QXmlStreamReader来解析格式良好的XML,Qt的文档中指出,它是一种更快.更方便的Qt自己的SAX解析器(QXml ...

  2. Qt解析xml

    发现用 Qt 解析 xml 文件非常方便,下面是一个简单的解析 xml 文件的例子: #include <QtCore/QCoreApplication> #include <QDo ...

  3. Qt中使用DOM解析XML文件或者字符串(实例)

    因为需要读取配置文件,我的配置文件采用xml:因此编写了使用qt读取xml文件内容的代码,xml文件如下: <?xml version="1.0" encoding=&quo ...

  4. java解析XML文件

    dom4j是一个Java的XML API,类似于jdom,用来读写XML文件的.dom4j是一个非常非常优秀的Java XML API,具有性能优异.功能强大和极端易用使用的特点,同时它也是一个开放源 ...

  5. OAF_文件系列5_实现OAF解析XML文件javax.xml.parsers(案例)

    20150729 Created By BaoXinjian

  6. QXmlStreamReader/QXmlStreamWriter实现Qt下xml文件读写

    版权声明:若无来源注明,Techie亮博客文章均为原创. 转载请以链接形式标明本文标题和地址: 本文标题:QXmlStreamReader/QXmlStreamWriter实现Qt下xml文件读写   ...

  7. Android 解析XML文件和生成XML文件

    解析XML文件 public static void initXML(Context context) { //can't create in /data/media/0 because permis ...

  8. JAVA使用SAX解析XML文件

    在我的另一篇文章(http://www.cnblogs.com/anivia/p/5849712.html)中,通过一个例子介绍了使用DOM来解析XML文件,那么本篇文章通过相同的XML文件介绍如何使 ...

  9. JAVA中使用DOM解析XML文件

    XML是一种方便快捷高效的数据保存传输的格式,在JSON广泛使用之前,XML是服务器和客户端之间数据传输的主要方式.因此,需要使用各种方式,解析服务器传送过来的信息,以供使用者查看. JAVA作为一种 ...

随机推荐

  1. Mac 的“任务管理器” —— 活动监视器

    昨天关机时,提示说 Safari 阻止了关机程序,请先关闭 Safari .再看 Safari 的退出按钮已灰.知道是 Safari 的进程僵死了. 根据对 Windows 使用的经验,首先想到了“任 ...

  2. bat 脚本传递参数测试

    start  CommissionMQMonitorService.exe   MMM 命令   执行器                                           参数

  3. d is undefined错误

    如图这样的错误:TypeError : d is undefined,今天早上在写代码的时候也是遇见这样的错误,报告的错误是jquery.js中错误,但是这样的问题经常是由于什么名字不对(个人见解), ...

  4. 编写类String的构造函数、析构函数和赋值函数

    已知类String的原型为: class String {   public:  String(const char *str = NULL); // 普通构造函数  String(const Str ...

  5. 浏览器兼容的css hack

    <style> div{ background:green; /* for firefox */ *background:red; /* for IE6 */ } </style&g ...

  6. easyui datagrid列中使用tooltip

    要实现这样一个效果:数据加载到DATAGRID中,鼠标移至某一列时,会弹出tooltip提示框. 最初的实现方法: { field: 'Reply', title: '备注', width: 220, ...

  7. 在HibernateTemplate里执行Sql语句

    如下所示只能执行非Select语句: public static void executeSQL(HibernateTemplate hibernateTemplate, String sql) { ...

  8. HDU 1513 Palindrome

    题目就是给一个字符串问最少插入多少个字符能让原字符串变为回文字符串. 算法: 用原串的长度减去原串与翻转后的串的最大公共字串的长度,就是所求答案. //#define LOCAL #include & ...

  9. 51nod1189 阶乘分数

    (x-n!)(y-n!)=n!2 ans=t[n]+1.t表示的是n!2的小于n!的约数个数.n!2=p1a1*p2a2*p3a3...t[n]=(a1+1)*(a2+1)...-1 /2; 2对于n ...

  10. HDU 1728 逃离迷宫【BFS】

    题意:给出一个起点,一个终点,规定的转弯次数,问能否在规定的转弯次数内到达终点--- 这一题是学(看)习(题)的(解)@_@ 主要学了两个地方 一个是剪枝,如果搜到的当前点的转弯次数小于该点turn数 ...