Qt提供了QDomElement 类用于完成对xml文件的读取和写入。
- 读文件
bool loadFile(QString filename)
{
m_fileName = filename;
if(!m_dom.isNull())
m_dom.clear();
QFile file(filename);
if (!file.open(QIODevice::ReadOnly))
{
std::cerr << "Can not open xml file : " << filename.toStdString();
return false;
}
QTextCodec *codec = QTextCodec::codecForName("UTF-8");
QByteArray bytes = file.readAll();
QString str1 = codec->toUnicode(bytes);
if (!m_dom.setContent(str1))
{
file.close();
m_dom.clear();
std::cerr << "Error in read xml file: " << filename.toStdString() << std::endl;
return false;
}
file.close();
return true;
}
2.写文件
bool saveFile(QString filename)
{
QFile file(filename);
file.open(QIODevice::WriteOnly);
QTextStream out(&file);
out.setCodec("UTF-8");
m_dom.save(out, 4, QDomNode::EncodingFromTextStream);
file.close();
return true;
}
3.字段访问和修改
//读取根节点
QDomElement XmlContent:: getRootNode()
{
QDomElement root = m_dom.documentElement();
if (root.tagName() != "Root")
return QDomElement();
return root;
}
//读取节点属性键值对
QMap<QString, QString> getNodeAttributes(QDomElement dom)
{
if (dom.isNull())
{
std::cerr << "node is null" << std::endl;
return QMap<QString, QString>();
}
QMap<QString, QString> attribute;
int n = dom.attributes().count();
for (int i = 0; i < n; ++i)
{
QString name = dom.attributes().item(i).nodeName();
QString value = dom.attribute(name, "");
attribute.insert(name, value);
}
return attribute;
}
//添加字符串节点 <nodeName>text</nodeName>
QDomElement addNode(QString nodeName, QString text)
{
QDomElement root = m_dom.documentElement();
if(root.tagName()!= "Root" )
return QDomElement();
QDomElement item;
QDomText tNode;
item = m_dom.createElement(nodeName);
tNode = m_dom.createTextNode(text);
item.appendChild(tNode);
root.appendChild(item);
return item;
}
//添加带属性表的节点<nodeName attr1="" attr2="" />
QDomElement addNode(QString nodeName,QMap<QString, QString> attribute)
{
QDomElement root = m_dom.documentElement();
if(root.tagName()!= "Root")
return QDomElement();
QDomElement item;
item = m_dom.createElement(nodeName);
root.appendChild(item);
QMap<QString, QString>::iterator it= attribute.begin();
while(it != attribute.end())
{
item.setAttribute(it.key(),it.value());
it++;
}
return item;
}
//为指定节点添加一个带属性节点
/**
* <pNode >
* <nodeName attr1="" attr2="" />
* </pNode>*/
QDomElement XmlContent::addNode(QString nodeName,QDomElement pNode,QMap<QString, QString> attribute)
{
if(pNode.isNull())
return QDomElement();
QDomElement item;
item = m_dom.createElement(nodeName);
pNode.appendChild(item);
QMap<QString, QString>::iterator it= attribute.begin();
while(it != attribute.end())
{
item.setAttribute(it.key(),it.value());
it++;
}
return item;
}
//为指定节点添加多个带属性节点
/**
* <pNode >
* <nodeName attr1="" attr2="" />
* <nodeName attr1="" attr2="" />
* ……
* </pNode>*/
QList<QDomElement> XmlContent::addNode(QString nodeName,QDomElement pNode,QList<QMap<QString, QString>> list)
{
QList<QDomElement> nodlist;
nodlist.clear();
if (pNode.isNull() || list.size() <= 0)
{
std::cerr << "can not find parent node. or sublist is empty.\n";
return nodlist;
}
for(int i = 0; i< list.size(); i++)
{
QDomElement item;
item = m_dom.createElement(nodeName);
if (item.isNull())
{
std::cerr << "Create Node failed. " << nodeName.toStdString();
return nodlist;
}
QMap<QString, QString>::iterator it= list[i].begin();
while(it != list[i].end())
{
item.setAttribute(it.key(),it.value());
it++;
}
nodlist.push_back(item);
pNode.appendChild(item);
}
return nodlist;
}
//使用示例
QDomElement root = getRootNode();
if (!root.isNull())
{
QDomElement sub = root.firstChildElement("SubList");//查找SubList节点
if (!sub.isNull())
{
QDomElement child = sub.firstChildElement("Item");//查找Item节点
while (!child.isNull())
{
QMap<QString, QString> map;
map = getNodeAttributes(child);//读取字段属性
child = child.nextSiblingElement("Item");//查找下一个兄弟节点
}
}
}