QT写xml

文章目录

  • qt写xml
    • 1. 代码
    • 2. QT新建文件夹

qt写xml

  • 感觉这部分代码的可复用性还是挺高的,记录一下方便下次使用
    1. 在.pro文件的第一行加上xml QT += core gui xml
    1. 写xml比较重要的一点是准备好xml里的参数
    1. 创建xml文件用QFile以只写的形式打开文件
    1. 用QDomDocument doc;创建xml树
    1. QDomProcessingInstruction instruction; instruction = doc.createProcessingInstruction("xml", "version=\"1.0\" encoding=\"UTF-8\""); doc.appendChild(instruction);创建xml第一行信息
    1. 创建根节点QDomElement root=doc.createElement("annotation");
    1. 利用doc.appendChild(root);将子节点root添加到父节点doc
    1. 利用text=doc.createTextNode(foldname);获取xml中俩个<> <>中间要填的值,并且利用
      Path.appendChild(text);将值写入该节点,最后再记得将子节点添加至父节点即可
    1. QFile打开了xml文件文件最后记得保存并且关上。

 

  • 提到了.pro文件就记录一下QT添加依赖的方法,在.pro文件下添加库的路径即可
INCLUDEPATH+=\
#需要链接的库文件就是#include<.h>里头文件所在的路径
#这个比起VisualStudio的配置还是简便很多的
D:/OpenCV/opencv/build/include \
D:/OpenCV/opencv/build/include/opencv2 \

LIBS+=\
#需要链接的静态库的路径记得加-L这样才是路径否则是单个的lib文件
-LD:/OpenCV/opencv/build/x64/vc15/lib \

#也可以右键项目选择添加库找到对应库所在文件夹进行添加

1. 代码

  • 完整代码可对应添加到需要的位置
//记得包含头文件
#include 
#include 

//获取当前打开的图片路径 等号后面的图片路径记得改成自己的,这个参数即xml里的path
//--例:temp为E:/picture/food/happy.jpg
QString temp = fileInfo->at(imageSerialNum).filePath();
//QString.toLocal8Bit().toStdString()转string可以做到中文不乱码 
//载入的待处理图片,imread里需是string类型
Mat srcImage = imread(temp.toLocal8Bit().toStdString());

//-------这里的是string类型QDomDocument写xml需QString类型--------------//
//-------这里只是写出来做个获取文件名的参考可以string转QString也可以直接用QString获取-----------//
//1.这里就是xml里的path图片路径
string path = temp.toLocal8Bit().toStdString();
//2.获取不带路径的文件名 即xml里的 filename
string::size_type iPos = path.find_last_of('/') + 1;
//3.获取不带后缀的文件名 这个xml里好像用不上不过其他地方也许用得上
//3.1 从指定位置开始复制子字符串  
string filename = path.substr(iPos, path.length() - iPos);
//3.2获取不带后缀的文件名 字符串截取.之前的内容
//rfind表示从右边开始寻找即最后一个.的索引
string names = filename.substr(0, filename.rfind("."));

//-----------------用QString获取上述部分参数----------------------//
//1.不带路径但带后缀的文件名 --例:FileName为happy.jpg
QString FileName = fileInfo->at(imageSerialNum).fileName();
//2.不带文件名的路径 --例:fold为E:/picture/food
QString fold = fileInfo->at(imageSerialNum).dir().path();
//3.图像所在文件夹名,即xml里的folder --例:foldname为food
//qt里.split可以将字符串以"/"切片,.last()即保留切片的最后一个字符串
QString foldname = fold.split("/").last();
//4.获取上一级目录名称 这个xml里用不上不过其他地方可以用到就写上来了
//lastIndexOf从右侧开始查找字符串/,即得到最后1个/的索引
int first = fold.lastIndexOf ("/");
//left保留字符串fold索引左边的字符串即/之前的字符串 --例:foldname2为E:/picture
QString foldname2 = fold.left (first);

//当前打开图像的宽高信息即xml里的width,height
int current_src_h=srcImage.rows;
int current_src_w=srcImage.cols;

//---------------前面的参数准备得差不多了开始写xml--------------//
//保存的xml的名称FileName.split(".")[0]即使不带后缀的文件名加上xml即 --例:xmlname为happy.xml
QString xmlname=FileName.split(".")[0]+".xml";
//fold为目录名加上xml文件名即可使用QFile打开文件进行写操作QFile::WriteOnly
QFile file(fold+'/'+xmlname);
if(!file.open(QFile::WriteOnly|QFile::Truncate))
    return;
//创建xml文档在内存中
QDomDocument doc;
//添加处理命令
QDomProcessingInstruction instruction;
//这个就是xml文件最上方那句
instruction = doc.createProcessingInstruction("xml", "version=\"1.0\" encoding=\"UTF-8\"");
doc.appendChild(instruction);
//创建根节点
QDomElement root=doc.createElement("annotation");
doc.appendChild(root);
//创建子节点
QDomElement Folder=doc.createElement("folder");
QDomText text; //设置括号标签中间的值
text=doc.createTextNode(foldname);
Folder.appendChild(text);

QDomElement Filename=doc.createElement("filename");
text=doc.createTextNode(FileName);
Filename.appendChild(text);

QDomElement Path=doc.createElement("path");
text=doc.createTextNode(temp);
Path.appendChild(text);

QDomElement Source=doc.createElement("source");
QDomElement Database=doc.createElement("database");
text=doc.createTextNode("Unknown");
Database.appendChild(text);

QDomElement Size=doc.createElement("size");
QDomElement Width=doc.createElement("width");
text=doc.createTextNode(QString::number(current_src_h));
Width.appendChild(text);

QDomElement Height=doc.createElement("height");
text=doc.createTextNode(QString::number(current_src_w));
Height.appendChild(text);

QDomElement Depth=doc.createElement("depth");
text=doc.createTextNode(QString::number(current_dst_image.channels()));
Depth.appendChild(text);

QDomElement Segmented=doc.createElement("segmented");
text=doc.createTextNode("0");
Segmented.appendChild(text);

//建立树
Source.appendChild(Database);
Size.appendChild(Width);
Size.appendChild(Height);
Size.appendChild(Depth);
root.appendChild(Folder);
root.appendChild(Filename);
root.appendChild(Path);
root.appendChild(Source);
root.appendChild(Size);
root.appendChild(Segmented);


//---------上方就是xml里图片的一些信息,下方是标注框以及类别信息可以放在循环里写入每个框的信息-------------//

//将每一个矩形坐标ROI信息写入xml文件
QDomElement Object=doc.createElement("object");
QDomElement Name=doc.createElement("name");
//strtext是类别信息
text=doc.createTextNode(QString::fromStdString(strtext));
Name.appendChild(text);

QDomElement Pose=doc.createElement("pose");
text=doc.createTextNode("Unspecified");
Pose.appendChild(text);

QDomElement Truncated=doc.createElement("truncated");
text=doc.createTextNode("0");
Truncated.appendChild(text);

QDomElement Difficult=doc.createElement("difficult");
text=doc.createTextNode("0");
Difficult.appendChild(text);

//矩形框的值 左上角右下角坐标
QDomElement Bndbox=doc.createElement("bndbox");
QDomElement Xmin=doc.createElement("xmin");
text=doc.createTextNode(QString::number(boundRect[i].x));
Xmin.appendChild(text);

QDomElement Ymin=doc.createElement("ymin");
text=doc.createTextNode(QString::number(boundRect[i].y));
Ymin.appendChild(text);

QDomElement Xmax=doc.createElement("xmax");
text=doc.createTextNode(QString::number(boundRect[i].x+boundRect[i].width));
Xmax.appendChild(text);

QDomElement Ymax=doc.createElement("ymax");
text=doc.createTextNode(QString::number(boundRect[i].y+boundRect[i].height));
Ymax.appendChild(text);

//建立树
Bndbox.appendChild(Xmin);
Bndbox.appendChild(Ymin);
Bndbox.appendChild(Xmax);
Bndbox.appendChild(Ymax);
Object.appendChild(Name);
Object.appendChild(Pose);
Object.appendChild(Truncated);
Object.appendChild(Difficult);
Object.appendChild(Bndbox);
root.appendChild(Object);

//----------------参数书写完毕,之前用QFile打开了文件记得用.close关闭-----------//
//xml输出到文件
QTextStream out_stream(&file);
doc.save(out_stream,4); //缩进4格
file.close();

2. QT新建文件夹

  • 对于不存在的文件夹路径记得用QDir().mkdir()创建
 bool ismkdir = QDir().mkdir(foldname2+'/'+foldname+"_result/");

你可能感兴趣的:(笔记,qt,xml,开发语言)