新手菜鸟求教育,QT读取XML文件

QTcainiaozzy 2018-01-12 08:14:32

...全文
2313 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
QtUnremitting 2018-07-27
  • 打赏
  • 举报
回复
以上代码可以参考下
QtUnremitting 2018-07-27
  • 打赏
  • 举报
回复
<?xml version='1.0' encoding='GB2312'?>
<students>
<student id="1" name="张三" age="20"/>
<student id="2" name="李四" age="21"/>
</students>


这个是xml文件
QtUnremitting 2018-07-27
  • 打赏
  • 举报
回复
struct XMLItem
{
int id;
QString name;
int age;
};

//! 读取一条记录
bool ReadItemFromXML(XMLItem & item)
{
// 打开xml文件
QFile file("D:\\test.xml");
if(!file.open(QIODevice::ReadOnly))
{
file.close();
return false;
}

QDomDocument doc;
QDomElement eleRoot;
if(!doc.setContent(&file))
{
file.close();
return false;
}
file.close();

// 查询记录
eleRoot = doc.documentElement();
QDomNodeList stunodes = doc.elementsByTagName("student");
if(stunodes.count() > 0)
{
for(int i = 0; i < stunodes.count(); i++)
{
if(stunodes.at(i).toElement().attribute("id").toInt() == item.id)
{
item.name = stunodes.at(i).toElement().attribute("name");
item.age = stunodes.at(i).toElement().attribute("age").toInt();
return true;
}
}
}
return false;
}

//! 删除一条记录
bool RemoveItemFromXML(XMLItem & item)
{
// 打开xml文件
QFile file("D:\\test.xml");
if(!file.open(QIODevice::ReadWrite))
{
file.close();
return false;
}
// 如果该文件为空文件,则添加xml文件头
QDomDocument doc;
QDomElement eleRoot;
if(file.atEnd())
{
QDomProcessingInstruction instruction;
instruction = doc.createProcessingInstruction("xml","version=\"1.0\" encoding=\"GB2312\"");
doc.appendChild(instruction);

eleRoot = doc.createElement("students");
doc.appendChild(eleRoot);
}
else
{
// 文件不为空,则设为document的内容
if(!doc.setContent(&file))
{
file.close();
return false;
}

// 删除记录
eleRoot = doc.documentElement();
QDomNodeList stunodes = doc.elementsByTagName("student");
if(stunodes.count() > 0)
{
for(int i = 0; i < stunodes.count(); i++)
{
if(stunodes.at(i).toElement().attribute("id").toInt() == item.id)
{
eleRoot.removeChild(stunodes.at(i));
break;
}
}
}
}
file.close();

// 重新写入xml文件
file.open(QIODevice::Truncate| QIODevice::WriteOnly);
QTextStream out(&file);
doc.save(out, 4);
file.close();
return true;
}

//! 插入一条记录
bool SaveItemToXML(XMLItem & item)
{
//删除相同id记录
RemoveFilterFromXML(item);

// 打开xml文件
QFile file("D:\\test.xml");
if(!file.open(QIODevice::ReadWrite))
{
file.close();
return false;
}
QDomDocument doc;
if(!doc.setContent(&file))
{
file.close();
return false;
}
file.close();

QDomElement eleRoot = doc.documentElement();
// 添加当前过滤项
QDomElement eleStu = doc.createElement("student");
eleStu.setAttribute("id", QString::number(item.id));
eleStu.setAttribute("name", item.name);
eleStu.setAttribute("age", QString::number(item.age));
eleRoot.appendChild(eleStu);

// 重新写入xml文件
file.open(QIODevice::Truncate| QIODevice::WriteOnly);
QTextStream out(&file);
doc.save(out, 4);
file.close();
return true;
}
相对论12 2018-07-09
  • 打赏
  • 举报
回复
如果没有特殊要求的话可以尝试使用QXmlStreamReader读取,感觉比dom方便很多,我上周刚好看了一下这个,你需要的话可以给你发一下。
_肆 2018-07-04
  • 打赏
  • 举报
回复
你是想问啥,我没看出来哪不对啊
内核之道 2018-07-04
  • 打赏
  • 举报
回复
在Qt中,当使用DOM(文档对象模型)来解析XML的时候,是把XML加载到dom内存对象中。每一个节点要作为元素去处理,你这里的问题是应该在关闭文件下面那里首先去获取doc的第一个元素,详细见该博客:https://blog.csdn.net/lixiaogang_theanswer/article/details/80870318
萧洛 2018-03-15
  • 打赏
  • 举报
回复
这里有一个实例程序可做参考:http://download.csdn.net/download/jxbinwd/10044343

16,199

社区成员

发帖
与我相关
我的任务
社区描述
Qt 是一个跨平台应用程序框架。通过使用 Qt,您可以一次性开发应用程序和用户界面,然后将其部署到多个桌面和嵌入式操作系统,而无需重复编写源代码。
社区管理员
  • Qt
  • 亭台六七座
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧