赞
踩
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” ? >
上述是一个完整的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文件结构复杂或修改需求更复杂,可能需要进一步调整代码。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。