耽误各位大侠一点qt 时间戳,帮忙用qt写一个xml文件,急用,xml文件的内容如下:再次谢谢了

QT通过DOM 读写XML的一个小问题_Linux编程_Linux公社-Linux系统门户网站
你好,游客
QT通过DOM 读写XML的一个小问题
来源:Linux社区&
作者:bloodkain
最近做一个背单词的小东东,需要在指定日期提示信息,用到了xml.工程不大,自然使用DOM.
工程中需要在指定日期中插入提示信息,最开始的想法是"查找+插入"的模式,需要同时读写操作,因此
QFile file("struct.xml");& if (!file.open(QFile::ReadWrite )){}
更改完毕后
QTextStream out(&fileWrite);& doc.save(out,3);& fileWrite.close();&
程序运行,没有错误提示.
但是最终得到的xml文件如下
&ROOT&&& &DATE DAY="周五 六月 15 2012"&&&&&& &LIST&Old&/LIST&&& &/DATE&&/ROOT&
&ROOT&&& &DATE DAY="周五 六月 15 2012"&&&&&& &LIST&Old&/LIST&&&&&& &LIST&New&/LIST&&& &/DATE&&/ROOT&
显然第一段是需要被替换,不应该出现的.调整了以下思路,更改程序如下
QFile fileRead("struct.xml");& if (!fileRead.open(QFile::ReadOnly )){}&&& ///只读模式打开文件
QString errorSint errorLint errorC
QDomDif (!doc.setContent(&fileRead, false, &errorStr, &errorLine,&&&&&&&&&&&& ///把fileRead塞进一个QDomDocument &errorColumn)) {qDebug()& && "Error: Parse error at line " && errorLine && ", "&& "column " && errorColumn && ": "&& qPrintable(errorStr) ;//}
fileRead.close();&&&& ///过河拆桥,关掉fileRead
更改完毕后
QFile fileWrite("struct.xml");&&
if(!fileWrite.open(QIODevice::WriteOnly | QIODevice::Truncate))& ///写入模式打开文件QTextStream out(&fileWrite);&
doc.save(out,3);& fileWrite.close();&
相关资讯 & & &
& (04/07/:36)
& (01/08/:52)
& (02月07日)
& (01/14/:20)
& (09/26/:09)
   同意评论声明
   发表
尊重网上道德,遵守中华人民共和国的各项有关法律法规
承担一切因您的行为而直接或间接导致的民事或刑事法律责任
本站管理人员有权保留或删除其管辖留言中的任意内容
本站有权在网站内转载或引用您的评论
参与本评论即表明您已经阅读并接受上述条款Qt5Xml.dll下载|Qt5Xml.dll文件丢失或损坏修复下载_最火软件站
您的位置: >
> Qt5Xml.dll文件丢失或损坏修复下载
Qt5Xml.dll文件丢失或损坏修复
运行环境:Windows
更新时间: 13:06:46
论坛转帖:
有无插件:无插件,请您放心使用!
分&享&到:
Qt5Xml.dll是电脑系统文件中的重要文件,当Qt5Xml.dll文件丢失或者损坏时可能会导致电脑的一些程序无法正常运行,这时需要对Qt5Xml.dll文件进行修复,本站为您提供Qt5Xml.dll文件下载方式,欢迎有需要的朋友下载使用。
dll怎么修复:
一、直接拷贝该文件到系统目录里: 1、Windows 95/98/Me系统,将Qt5Xml.dll复制到C:/Windows/System目录下。 2、Windows NT/2000系统,将Qt5Xml.dll复制到C:/WINNT/System32目录下。 3、Windows XP/WIN7系统,将Qt5Xml.dll复制到C:/Windows/System32目录下。 二、然后打开&开始-运行-输入regsvr32 Qt5Xml.dll&,回车即可解决错误提示!
点击链接开始下载[Qt教程] 第28篇
XML(二)使用DOM创建和操作XML文档
22:00:51 | 查看:
475| 回复: 0
使用DOM创建和操作XML文档
该文章原创于作者yafeilinux,转载请注明出处!
在上一节中我们用手写的方法建立了一个XML文档,并且用DOM的方法对其进行了读取。
22:00:51 | 查看:
475| 回复: 0
使用DOM创建和操作XML文档
该文章原创于作者yafeilinux,转载请注明出处!
在上一节中我们用手写的方法建立了一个XML文档,并且用DOM的方法对其进行了读取。现在我们使用代码来创建那个XML文档,并且对它实现查找、更新、插入等操作。
环境:Windows Xp + Qt 4.8.4+QtCreator 2.6.2
一、创建文档
二、读取文档
三、添加节点
四、查找、删除、更新操作
一、创建文档
1.新建Qt Gui应用,项目名称为myDom_2,基类为QMainWindow,类名为MainWindow。
2.完成后打开myDom_2.pro,然后将第一行代码更改为:
保存该文件。
3.双击mainwindow.ui进入设计模式,往界面上添加Push Button,Label,Line
Edit,List Widget等部件,设计界面如下图所示。
4.完成后,打开mainwindow.cpp文件,先包含头文件#include &QtXml&,然后在构造函数中添加如下代码:
QFile file("my.xml");
// 只写方式打开,并清空以前的信息
if(!file.open(QIODevice::WriteOnly
| QIODevice::Truncate))
QDomDocument
QDomProcessingInstruction
//添加处理指令
instruction = doc.createProcessingInstruction("xml","version=\"1.0\"encoding=\"UTF-8\"");
doc.appendChild(instruction);
QDomElement root
= doc.createElement(tr("书库"));
doc.appendChild(root); //添加根元素
// 添加第一个book元素及其子元素
QDomElement book
= doc.createElement(tr("图书"));
QDomAttr id
= doc.createAttribute(tr("编号"));
QDomElement title
= doc.createElement(tr("书名"));
QDomElement author
= doc.createElement(tr("作者"));
id.setValue(tr("1"));
book.setAttributeNode(id);
text = doc.createTextNode(tr("Qt"));
title.appendChild(text);
text = doc.createTextNode(tr("shiming"));
author.appendChild(text);
book.appendChild(title);
book.appendChild(author);
root.appendChild(book);
// 添加第二个book元素及其子元素
book = doc.createElement(tr("图书"));
id = doc.createAttribute(tr("编号"));
title = doc.createElement(tr("书名"));
author = doc.createElement(tr("作者"));
id.setValue(tr("2"));
book.setAttributeNode(id);
text = doc.createTextNode(tr("Linux"));
title.appendChild(text);
text = doc.createTextNode(tr("yafei"));
author.appendChild(text);
book.appendChild(title);
book.appendChild(author);
root.appendChild(book);
QTextStream out(&file);
doc.save(out,4); // 将文档保存到文件,4为子元素缩进字符数
file.close();
这里先使用QDomDocument类在内存中生成了一棵DOM树,然后调用save()函数利用QTextStream文本流将DOM树保存在了文件中。在生成DOM树时主要使用了createElement()等函数来生成各种节点,然后使用appendChild()将各个节点依次追加进去。
5.打开main.cpp文件,先包含头文件:#include &QTextCodec&,然后在main()函数第一行代码后面添加如下代码:
QTextCodec::setCodecForTr(QTextCodec::codecForName("utf8"));
6.运行程序,可以看到在构建目录中生成了my.xml文件,可以双击查看该文件的内容,效果如下图所示。
二、读取文档
下面我们读取整个文档的内容,并显示在List Widget部件上面,这里用的就是上一节讲到的内容。我们进入“查看全部信息”按钮单击信号槽,更改如下:
void MainWindow::on_pushButton_5_clicked()
ui-&listWidget-&clear();
//先清空显示
QFile file("my.xml");
if (!file.open(QIODevice::ReadOnly)) return ;
QDomDocument
if (!doc.setContent(&file))
file.close();
file.close();
//返回根节点及其子节点的元素标记名
QDomElement docElem = doc.documentElement();
//返回根元素
QDomNode n = docElem.firstChild();
//返回根节点的第一个子节点
while(!n.isNull())
//如果节点不为空
if (n.isElement()) //如果节点是元素
QDomElement e = n.toElement(); //将其转换为元素
ui-&listWidget-&addItem(e.tagName()
+e.attribute(tr("编号")));
QDomNodeList list = e.childNodes();
for(int i=0; i&list.count(); i++)
QDomNode node = list.at(i);
if(node.isElement())
ui-&listWidget-&addItem("
+node.toElement().tagName()
: "+node.toElement().text());
n = n.nextSibling();
//下一个兄弟节点
运行程序,效果如下图所示。
三、添加节点
1.首先在设计模式,把书名和作者标签后面的Line Edit部件的objectName分别更改为lineEdit_title和lineEdit_author。如下图所示。
2.然后进入添加按钮的单击信号槽,添加如下代码:
void MainWindow::on_pushButton_4_clicked()
ui-&listWidget-&clear(); //我们先清空显示,然后显示“无法添加!”
ui-&listWidget-&addItem(tr("无法添加!"));
QFile file("my.xml");
if (!file.open(QIODevice::ReadOnly)) return;
QDomDocument
if (!doc.setContent(&file))
file.close();
file.close();
QDomElement root = doc.documentElement();
QDomElement book = doc.createElement(tr("图书"));
QDomAttr id = doc.createAttribute(tr("编号"));
QDomElement title = doc.createElement(tr("书名"));
QDomElement author = doc.createElement(tr("作者"));
// 我们获得了最后一个孩子结点的编号,然后加1,便是新的编号
QString num = root.lastChild().toElement().attribute(tr("编号"));
int count = num.toInt() +1;
id.setValue(QString::number(count));
book.setAttributeNode(id);
text = doc.createTextNode(ui-&lineEdit_title-&text());
title.appendChild(text);
text = doc.createTextNode(ui-&lineEdit_author-&text());
author.appendChild(text);
book.appendChild(title);
book.appendChild(author);
root.appendChild(book);
if(!file.open(QIODevice::WriteOnly | QIODevice::Truncate))
QTextStream out(&file);
doc.save(out,4);
//将文档保存到文件,4为子元素缩进字符数
file.close();
ui-&listWidget-&clear(); //最后更改显示为“添加成功!”
ui-&listWidget-&addItem(tr("添加成功!"));
这里先用只读方式打开XML文件,将其读入doc中,然后关闭。我们将新的节点加入到最后面,并使其“编号”为以前的最后一个节点的编号加1。最后我们再用只写的方式打开XML文件,将修改完的doc写入其中。运行程序,效果如下图所示。
再次查看全部信息,可以看到新的节点已经添加了,如下图所示。
四、查找、删除、更新操作
因为这三个功能都要先利用“编号”进行查找,所以我们放在一起实现。
1.首先将界面上“图书编号”后面的Line Edit部件的objectName更改为lineEdit_id。
2.在mainwindow.h文件中添加public类型的函数声明:
void doXml(constQString operate);
我们使用这个函数来完成三种不同的操作,根据参数来判断不同的操作。
3.然后到mainwindow.cpp中添加该函数的定义:
void MainWindow::doXml(const QString operate)
ui-&listWidget-&clear();
ui-&listWidget-&addItem(tr("没有找到相关内容!"));
QFile file("my.xml");
if (!file.open(QIODevice::ReadOnly)) return ;
QDomDocument
if (!doc.setContent(&file))
file.close();
file.close();
QDomNodeList list = doc.elementsByTagName(tr("图书"));
// 以标签名进行查找
for(int i=0; i&list.count(); i++)
QDomElement e = list.at(i).toElement();
// 如果元素的“编号”属性值与我们所查的相同
if(e.attribute(tr("编号")) == ui-&lineEdit_id-&text())
// 如果元素的“编号”属性值与我们所查的相同
if(operate == "delete")
//如果是删除操作
QDomElement root = doc.documentElement(); //取出根节点
root.removeChild(list.at(i));
//从根节点上删除该节点
QFile file("my.xml");
//保存更改
if(!file.open(QIODevice::WriteOnly | QIODevice::Truncate))
QTextStream out(&file);
doc.save(out,4);
file.close();
ui-&listWidget-&clear();
ui-&listWidget-&addItem(tr("删除成功!"));
else if(operate == "update")
//如果是更新操作
QDomNodeList child = list.at(i).childNodes();
//找到它的所有子节点,就是“书名”和“作者”
child.at(0).toElement().firstChild().setNodeValue(ui-&lineEdit_title-&text());
//将它子节点的首个子节点(就是文本节点)的内容更新
child.at(1).toElement().firstChild().setNodeValue(ui-&lineEdit_author-&text());
QFile file("my.xml");
//保存更改
if(!file.open(QIODevice::WriteOnly | QIODevice::Truncate))
QTextStream out(&file);
doc.save(out,4);
//保存文档,4为子元素缩进字符数
file.close();
ui-&listWidget-&clear();
ui-&listWidget-&addItem(tr("更新成功!"));
else if(operate == "find")
//如果是查找操作
ui-&listWidget-&clear();
ui-&listWidget-&addItem(e.tagName()+e.attribute(tr("编号")));
QDomNodeList list = e.childNodes();
for(int i=0; i&list.count(); i++)
QDomNode node = list.at(i);
if(node.isElement())
ui-&listWidget-&addItem("
"+node.toElement().tagName()
: "+node.toElement().text());
4. 下面我们分别进入“查找”,“删除”,“更新”三个按钮的单击信号槽,更改如下:
// 查找void MainWindow::on_pushButton_clicked(){
doXml("find");}// 删除void MainWindow::on_pushButton_2_clicked(){
doXml("delete");}// 更新void MainWindow::on_pushButton_3_clicked(){
doXml("update");}下面运行程序,查找操作结果如下图所示。
然后对编号为1的图书进行更新,效果如下图所示。
更新后我们再次查看所有内容。如下图所示。
然后进行删除操作,如下图所示。
删除后再次查询所有内容。效果如下图所示。
通过本节的例子可以看到使用DOM可以很方便的进行XML文档的随机访问,这也是它最大的优点。关于更多更详细的内容可以参考的相关章节。
涉及到的源码:
KB, 下载次数: 12)
版权声明:本文内容由互联网用户自发贡献,本社区不拥有所有权,也不承担相关法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件至: 进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容。
用云栖社区APP,舒服~
【云栖快讯】首届阿里巴巴中间件技术峰会,揭秘阿里10年分布式技术沉淀!阿里高可用体系核心缔造者、全链路压测创始人,DRDS与TDDL负责人等大咖出场,干货分享,不可错过!&&
操作审计(ActionTrail)会记录您的云账户资源操作,提供操作记录查询,并可以将记录文件保存到您指定的OS...
是一种简单易用的云计算资源管理和自动化运维服务。用户通过模板描述多个云计算资源的依赖关系、配置等,并自动完成所有...
服务底层使用经国家密码管理局检测认证的硬件密码机,通过虚拟化技术,帮助用户满足数据安全方面的监管合规要求,保护云...
为您提供简单高效、处理能力可弹性伸缩的计算服务,帮助您快速构建更稳定、安全的应用,提升运维效率,降低 IT 成本...
2017杭州云栖大会火热抢票
Loading...用户名:elbertchen
文章数:145
评论数:31
访问量:445040
注册日期:
阅读量:1297
阅读量:3317
阅读量:440921
阅读量:1127293
[匿名]非常感谢:
51CTO推荐博文
&&&& 现在测试很多接口返回的类型是xml的字符串,当返回值为较小的值的时候。期望结果直接写在代码里边是靠普的。但是当返回结果相当大的时候,期望值保存在哪里呢,以前我也做过直接写在代码里,结果造成代码行相当的长,几乎一个测试用例只能看见期望结果的数据了,自然不好。那么如果存在文件里如何呢?可能会有这样的问题存在文件里如何对比呢,采用文本内容对比吗?总觉得不太靠普,至少xml特性没能体现,譬如不能告诉我是哪个节点出错了。&&& 今天我发现xmlunit有这个功能(有点后知后觉,大家不要笑话);而且结合xml其他的jar包可以快速解决这个问题,而且代码也很精简,特贴代码如下&public void tet() throws Exception&{& String actXmlText ="&?xml version=\"1.0\" encoding=\"utf-8\"?&" +"\r\n"+& "&error_response&" +"\r\n"+& " &args&" +"\r\n"+& "& &arg&&/arg&" +"\r\n"+& " &/args&" +"\r\n"+& " &code&16&/code&" +"\r\n"+& " &msg&wang wang service return error&/msg&" +"\r\n" +& " &sub_code&33000&/sub_code&" +"\r\n" +& " &sub_msg&wang wang service error: param error.&/sub_msg&" +"\r\n" +& "&/error_response&";& System.out.println(actXmlText);& DocumentBuilderFactory domfac = DocumentBuilderFactory.newInstance();& DocumentBuilder dombuilder=domfac.newDocumentBuilder();& InputStream is= new FileInputStream("c:/11.xml");& Document doc = dombuilder.parse(is);& InputStream is1 = new FileInputStream("c:/12.xml");& Document doc1 = dombuilder.parse(is1);& Document doc2& =& dombuilder.parse( new& ByteArrayInputStream(actXmlText.getBytes()));& XMLAssert.assertXMLEqual(doc2, doc);& XMLAssert.assertXMLEqual(doc2, doc1);&}&这里为了方便代码展示没有将actXmlText写成大字符串,实际上通常测试场景中这个代表调用接口返回值,代码会是类似下面的代码& WebConversation conversation = new WebConversation();& WebRequest request = new PostMethodWebRequest(Url);& WebResponse response = conversation.getResponse(request);& System.out.println(response.getText());& String actXmlText = response.getText();&测试结果错误会报如下内容,明确告诉你哪个节点出错了:& junit.framework.AssertionFailedError: org.custommonkey.xmlunit.Diff[different] Expected text value ‘16′ but was ‘15′ C comparing 16 at /error_response[1]/code[1]/text()[1] to 15 at /error_response[1]/code[1]/text()[1]
&本文出自 “” 博客,请务必保留此出处
了这篇文章
类别:┆阅读(0)┆评论(0)

我要回帖

更多关于 qt qdatetime 时间差 的文章

 

随机推荐