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;
};