Qt 读写 XML

    xiaoxiao2021-12-02  16

    bool MAS_ParseBase::setContent( QDomDocument& document ) { if ( !document.setContent( m_pFile, false ) ) { return false; } m_pFile->close(); }

    void MAS_ParseBase::save( QDomDocument& document ) { QTextStream out( m_pFile ); out.setCodec( "UTF-8" ); document.save( out, 4 ); m_pFile->close(); }

    void MAS_ParseBase::getSubNode( QDomElement element, XMLNode& xml ) { // 循环记录子节点信息 QDomNode firstNode = element.firstChild(); while ( !firstNode.isNull() ) { QDomElement firstElement = firstNode.toElement(); XMLNode xmlFirst; xmlFirst.qstrTagName = firstElement.tagName(); QDomNamedNodeMap nodeMap = firstElement.attributes(); for ( int i=0; i<nodeMap.size(); i++ ) { NodeAttribute attribute; attribute.qstrNodeName = nodeMap.item(i).nodeName(); attribute.qstrNodeValue = nodeMap.item(i).nodeValue(); xmlFirst.vtAttribute.push_back(attribute); } if ( !firstElement.firstChild().toElement().isNull() ) { getSubNode( firstElement, xmlFirst ); } else { xmlFirst.qstrValue = firstElement.toElement().text(); } xml.vtSubNode.push_back( xmlFirst ); firstNode = firstNode.nextSibling(); } } void MAS_ParseBase::setSubNode( QDomDocument& document, QDomElement element, std::vector< XMLNode >& vtXML ) { for ( int i=0; i<vtXML.size(); i++ ) { // 添加子节点属性信息 QDomElement firstElement = document.createElement( vtXML.at(i).qstrTagName ); for ( int m=0; m<vtXML.at(i).vtAttribute.size(); m++ ) { firstElement.setAttribute( vtXML.at(i).vtAttribute.at(m).qstrNodeName, vtXML.at(i).vtAttribute.at(m).qstrNodeValue ); } element.appendChild( firstElement ); if ( vtXML.at(i).vtSubNode.size() > 0 ) { setSubNode( document, firstElement, vtXML.at(i).vtSubNode ); } else { firstElement.appendChild( document.createTextNode( vtXML.at(i).qstrValue ) ); } } } XMLNode MAS_ParseXML::read() { XMLNode xml; QDomDocument document; if ( !setContent(document) ) { return xml; } QDomElement element = document.documentElement(); // 记录根节点信息 xml.qstrTagName = element.tagName(); QDomNamedNodeMap nodeMap = element.attributes(); for ( int i=0; i<nodeMap.size(); i++ ) { NodeAttribute attribute; attribute.qstrNodeName = nodeMap.item(i).nodeName(); attribute.qstrNodeValue = nodeMap.item(i).nodeValue(); xml.vtAttribute.push_back(attribute); } // 递归获取子节点 getSubNode( element, xml ); return xml; } void MAS_ParseXML::write( XMLNode xml ) { // 添加文件头信息 QDomDocument document; QDomProcessingInstruction instruction = document.createProcessingInstruction( "xml", "version = \"1.0\" encoding = \"UTF-8\"" ); document.appendChild( instruction ); // 添加根节点 QDomElement element = document.createElement( xml.qstrTagName ); for ( int i=0; i<xml.vtAttribute.size(); i++ ) { element.setAttribute( xml.vtAttribute.at(i).qstrNodeName, xml.vtAttribute.at(i).qstrNodeValue ); } document.appendChild( element ); // 递归写入子节点 setSubNode( document, element, xml.vtSubNode ); // 将数据写入到XML文件,文件的每个空间为4个空格 save( document ); QMessageBox::information( NULL, QString::fromLocal8Bit("文件写入进度提示:"), QString::fromLocal8Bit("文件写入完毕!"), QMessageBox::Ok ); } XML解析用到的结构体:

    struct NodeAttribute { QString qstrNodeName; QString qstrNodeValue; }; struct XMLNode { QString qstrTagName; QString qstrValue; std::vector< NodeAttribute > vtAttribute; std::vector< XMLNode > vtSubNode; };

    转载请注明原文地址: https://ju.6miu.com/read-679640.html

    最新回复(0)