最近在做一个项目,其中用的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文件如下