Qt对xml文件进行读、写、修改等

本文详细介绍了使用QT库中的QXmlStreamWriter和QXmlStreamReader类进行XML文件的读写操作,包括文件准备、元素和属性的创建、以及如何处理XML数据流。同时展示了如何修改XML文件中的属性值。
摘要由CSDN通过智能技术生成

QT读写.xml文件*
使用QT读写xml文件需要使用以下四个要素:
① QXmlStreamWriter类:用于写xml文件;
② QXmlStreamReader类:用于读xml文件;
③ QFile类、目标路径:绑定目标路径来创建/打开文件。

下文通过对xml读写类及对*.xml文件读写举例来加深对xml文件的了解。

1.QXmlStreamWriter类主要函数说明
QXmlStreamWriter类主要用于写xml文件,QXmlStreamWriter主要包含以下方法:
SetAutoFormatting(bool):
用于设置xml文件格式,当入参为true时,QXmlStreamWriter将自动在xml文档中添加缩进和换行符,以提高可读性。这样生成的xml文件有一种良好的缩进和结构,使得xml文件更易于阅读和理解;若入参为false,则内容为一行长字符串。

writeStartDocument():写xml文档开始部分,即xml声明,包括文档版本和编码信息;
WriteEndDocument():结束写入xml文档。

writeStartElement(“xxx”):开始写入xml文档根元素。
writeEndElement():开始结束写入xml文档根元素。
备注:writeStartElement(“xxx”)中可以反复嵌套

writeAttribute(“id”, “001”):为元素写入属性,xxxx(“属性名”, “属性值”)
在xml中,元素可以具有属性,属性提供了有关元素的附加信息,如:
Alice< / student>
元素具有一个名为“id”的属性,其值“为001”

writeCharacters(“Alice”):写入元素的文本内容

writeTextElement(“title”, “QT Programming”):写入带有文本内容的元素的方法

2.QXmlStreamReader类主要函数说明

TokenType:
TokenType:xml数据的枚举类型,Qt中xml数据是通过一系列标记来表示的,每个标记可能代表一个元素、属性、文本等。可以根据解析出的不同的标记类型进行相应的处理。
ReadNext:
用于读取xml数据流中的下一个标记(token)并返回其类型,以便可以根据token类型进行相应的处理,比如 解析元素、属性、文本等。
isStartDocument:检查当前标记是否是xml文档开始的标记;
isEndDocument:检查当前标记是否是xml文档结束的标记。

isStartElement:用于判断当前token是否为开始元素的标记;
isEndElement:用于判断当前token是否为结束元素的标记。

isCharacters:用于检查token是否为包含字符数据的标记,对应xml元素的文本内容;
isWhitespace:用于检查当前token是否为包含空白字符的标记,如:空格、换行;
isComment:用于检查当前token是否为注释的标记;

QStringRef name() const:返回当前xml元素的名称作为QStringRef 类型的引用
QXmlStreamReader xml(&file);
if (xml.name() == “MachinePart_Static”){
xxx;
}

QXmlStreamAttributes attributes() const:用于获取xml元素的属性列表
QXmlStreamReader xml(&file);
xml.name() == “rgb” // 获取属性名称
int r = xml.attributes().value(“R”).toInt(); // 获取属性值
int g = xml.attributes().value(“G”).toInt();
int b = xml.attributes().value(“B”).toInt();

3.QT读写.xml文件*
3.1QT写.xml文件*
< ? xml version = “1.0” encoding = “UTF-8” ? >


QT Programming
John Doe
2022


XML Basics
Jane Smith< / author>
2020

上述是一个完整的xml文档,根据上述的xml文档内容,其具体的xml书写代码如下所示:

#include
#include

int main() {
	// 创建一个QFile对象用于写入XML文件
	QFile file("D/xxx/xxx/catalog.xml");
	if (!file.open(QIODevice::WriteOnly)) {
		return -1;
	}

	// 创建一个QXmlStreamWriter对象
	QXmlStreamWriter writer(&file);
	writer.setAutoFormatting(true);  // 自动格式化输出

	// 开始写入XML文档
	writer.writeStartDocument();
	writer.writeStartElement("catalog");  // 开始写入根元素

	// 写入第一本书的信息
	writer.writeStartElement("book");
	writer.writeAttribute("id", "001");
	writer.writeTextElement("title", "QT Programming");
	writer.writeTextElement("author", "John Doe");
	writer.writeTextElement("year", "2022");
	writer.writeEndElement();  // 结束第一本书的元素

	// 写入第二本书的信息
	writer.writeStartElement("book");
	writer.writeAttribute("id", "002");
	writer.writeTextElement("title", "XML Basics");
	writer.writeTextElement("author", "Jane Smith");
	writer.writeTextElement("year", "2020");
	writer.writeEndElement();  // 结束第二本书的元素

	writer.writeEndElement();  // 结束根元素
	writer.writeEndDocument();  // 结束写入XML文档

	// 关闭文件
	file.close();

	return 0;
}

3.2QT读.xml文件(以xml加载igs文件为例)*
bool CXmlTool::ReadXmlFile(const QString & filename, View* view)
{
QFile file(filename);
if (!file.open(QIODevice::ReadOnly | QIODevice::Text)){
qDebug() << QStringLiteral(“无法打开XML文件”);
return false;
}

QXmlStreamReader xml(&file);
while (!xml.atEnd() && !xml.hasError()) {
	QXmlStreamReader::TokenType token = xml.readNext();
	QString pathFile;   // 部件路径
	QColor rgb;         // 部件颜色

	if (token == QXmlStreamReader::StartElement) {
		if (xml.name() == "MachinePart_Static") {
			while (!(xml.tokenType() == QXmlStreamReader::EndElement &&
				xml.name() == "MachinePart_Static")) {

				if (xml.tokenType() == QXmlStreamReader::StartElement &&
					xml.name() == "stlFile") {


					while (!(xml.tokenType() == QXmlStreamReader::EndElement &&
						xml.name() == "stlFile")) {
						if (xml.tokenType() == QXmlStreamReader::StartElement &&
							xml.name() == "Path") {
							pathFile = xml.attributes().value("File").toString();
						}

						if (xml.tokenType() == QXmlStreamReader::StartElement &&
							xml.name() == "rgb") {
							int r = xml.attributes().value("R").toInt();
							int g = xml.attributes().value("G").toInt();
							int b = xml.attributes().value("B").toInt();
							rgb = QColor(r, g, b);
						}

						xml.readNext();
					}

					qDebug() << "stlFile Path File: " << pathFile;
					qDebug() << "stlFile RGB: " << rgb;
				}

				//导入IGES机床部件
				IGESControl_Reader myIgesReader;
				Standard_Integer nIgesFaces, nTransFaces;

				myIgesReader.ReadFile(Standard_CString(pathFile.toStdString().c_str()));

				Handle(TColStd_HSequenceOfTransient) myList = myIgesReader.GiveList("iges-faces");
				//selects all IGES faces in the file and puts them into a list called //MyList,
				nIgesFaces = myList->Length();
				nTransFaces = myIgesReader.TransferList(myList);
				//translates MyList,

				qDebug() << "IGES Faces: " << nIgesFaces << " Transferred:" << nTransFaces;
				TopoDS_Shape aShape = myIgesReader.OneShape();
				Handle(AIS_Shape) anAisModel = new AIS_Shape(aShape);
				anAisModel->SetColor(Quantity_NOC_BLUE1);
				anAisModel->SetTransparency(0);
				view->getContext()->Display(anAisModel, Standard_True);

				xml.readNext();
			}
		}
	}
}

if (xml.hasError()) {
	qDebug() << "XML error: " << xml.errorString();
}

file.close();

return true;

}

3.3QT修改.xml文件*

目标:将File改为FilePath
/-----------------------------------------/

<?xml version="1.0" encoding="UTF-8"?>

<Machine_Config_File Post=“MutiAxis”>

<MachinePart_OperPlatform>




</MachinePart_OperPlatform>

</Machine_Config_File>
/-----------------------------------------/

要通过Qt + C++修改XML文件中的File为FilePath,可以使用Qt提供的XML操作类QDomDocument和QDomElement来实现。
以下是一个示例代码,演示了如何加载XML文件、修改节点属性和保存修改后的XML文件:

#include
#include
#include
#include

	int main(int argc, char *argv[])
{
	QCoreApplication a(argc, argv);

	// 加载XML文件
	QDomDocument doc;
	QFile file("path/to/your/xml/file.xml");
	if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) {
		qDebug() << "Failed to open XML file";
		return a.exec();
	}
	if (!doc.setContent(&file)) {
		qDebug() << "Failed to set XML content";
		file.close();
		return a.exec();
	}
	file.close();

	// 获取根节点
	QDomElement root = doc.documentElement();

	// 获取Machine_Config_File节点
	QDomElement machineConfig = root.firstChildElement("Machine_Config_File");

	// 获取MachinePart_OperPlatform节点
	QDomElement machinePartOperPlatform = machineConfig.firstChildElement("MachinePart_OperPlatform");

	// 获取stlFile节点
	QDomElement stlFile = machinePartOperPlatform.firstChildElement("stlFile");

	// 修改File为FilePath
	QDomElement path = stlFile.firstChildElement("Path");
	QDomAttr fileAttr = path.attributeNode("File");
	QDomAttr filePathAttr = doc.createAttribute("FilePath");
	filePathAttr.setValue(fileAttr.value());
	path.removeAttributeNode(fileAttr);
	path.setAttributeNode(filePathAttr);

	// 保存修改后的XML文件
	QFile saveFile("path/to/save/xml/file.xml");
	if (!saveFile.open(QIODevice::WriteOnly | QIODevice::Text)) {
		qDebug() << "Failed to open save XML file";
		return a.exec();
	}
	QTextStream out(&saveFile);
	doc.save(out, 4);
	saveFile.close();

	qDebug() << "XML file updated successfully";

	return a.exec();
}
你需要将"path/to/your/xml/file.xml"替换为你的XML文件路径,将"path/to/save/xml/file.xml"替换为你要保存修改后的XML文件路径。

此代码将加载XML文件,找到要修改的节点和属性,然后将File属性改为FilePath,最后保存修改后的XML文件。
请注意,此示例仅适用于修改单个File属性为FilePath属性的情况,如果XML文件结构复杂或修改需求更复杂,可能需要进一步调整代码。

  • 14
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值