if (!doc.setContent(&file))出错的解决方法

      最近在做一个项目,其中用的xml文件,用来构造用户的数据库,但是在使用过程中一直卡在if(!doc.setContent(&file))这句上。试了各种方法才最终解决。现在我来分享我的解决方法。之前在网上查如何解决if(!doc.setContent(&file))错误的解决方法,很多人说是file文件路径的问题,很多人说要用绝对路径或者是将xml文件存入资源文件中,但是我试了几次都没解决问题,之后我再试了其他方法,最终我发现是instruction=doc.createProcessingInstruction("xml","version=\"1.0\" encoding=\"UTF-8\"");这句出问题了。虽然这句话是按规定格式来写的,但是可能由于QT本身的问题一直没能正确的定义好xml文件的版本,因此在将xml文件递给doc解析时一直出错。我的解决方法是使用QXmlStreamWriter创建XML文件。不多说了,直接上源码。

 QDomDocument doc;
QFile file("userdata.xml");
if(!file.open(QIODevice::WriteOnly|QIODevice::Text))
return;
 //采用QXmlStreamWriter 类来创建xml文件
QXmlStreamWriter writer(&file);
writer.setAutoFormatting(true); // 自动格式化
writer.writeStartDocument();  // 开始文档(XML 声明,)系统会自动定义xml的版本 
writer.writeEndDocument();  // 结束文档
 file.close();  // 关闭文件
 if(!file.open(QIODevice::WriteOnly|QIODevice::Text))// 重新打开文件
  return;
 
 //添加根节点,采用QDomDocument类来添加节点
  QDomElement root=doc.createElement(QString::fromLocal8Bit("用户使用记录"));
  doc.appendChild(root);
 
  //添加第一个子节点及其子元素
  QDomElement date=doc.createElement(QString::fromLocal8Bit("日期"));
 
  QDomAttr curdate=doc.createAttribute("date");
  QString msgdate;//date
  QDate current_date =QDate::currentDate();   //获取当前日期
  msgdate=current_date.toString("yyyy-MM-dd" );//("hh:mm:ss" );
  curdate.setValue(msgdate);
  date.setAttributeNode(curdate);
 
 
  QDomElement time =doc.createElement(QString::fromLocal8Bit("时间")); //创建子元素
  QDomAttr curtime=doc.createAttribute("time");
 
   QTime current_time =QTime::currentTime();
  msgtime=current_time.toString("hh:mm:ss" );
  curtime.setValue(msgtime);
  time.setAttributeNode(curtime);
 
  QDomElement msgtype =doc.createElement( QString::fromLocal8Bit("信息类型")); //创建子元素
  QDomElement msg =doc.createElement( QString::fromLocal8Bit("信息")); //创建子元素
  QDomText text;
  text=doc.createTextNode("info");
  msgtype.appendChild(text);
  text=doc.createTextNode( QString::fromLocal8Bit("成功创建新账号!"));
  msg.appendChild(text);
 time.appendChild(msgtype);
 time.appendChild(msg);
 date.appendChild(time);
 root.appendChild(date);
       //输出到文件
  QTextStream out_stream(&file);
 doc.save(out_stream,4); //缩进4格
 file.close();  // 关闭文件

这样,在读xml文件时就不会出错。

之所以不全程使用QXmlStreamWriter来写xml呢,是因为QXmlStreamWriter写xml会覆盖之前的内容,所以才有QDomDocument类来写XML文件。生成的xml文件如下


  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值