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” ? >
John Doe
2022
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
/-----------------------------------------/
<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文件结构复杂或修改需求更复杂,可能需要进一步调整代码。