Qt中使用QDomDocument读写XML文件

注意事项

1、在*.pro文件中添加 QT += xml;
2、xml文件中只能存在一个根节点,如果存在根节点的兄弟节点,则只能读取到第一个根节点的内容。

#include 
#include 
#include 
#include 

int main(int argc, char *argv[])
{
    //1.创建XML文件
    QString strFile = QString("../test.xml");
    if(QFile::exists(strFile)) //如果文件已存在,进行删除
    {
        QFile::remove(strFile);
    }

    QFile file(strFile);
    if(!file.open(QIODevice::ReadWrite))
    {
        return -1; //新建文件打开失败
    }

    QTextStream stream(&file);
    stream.setCodec("UTF-8"); //使用utf-8格式

    //xml文件中只能有一个根节点,如果存在多个根节点则读取时只能读到第一个节点的内容
    QDomDocument doc;
    QDomProcessingInstruction xmlInstruction = doc.createProcessingInstruction("xml", "version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"");
    QDomComment comment = doc.createComment(QString::fromUtf8("这是备注"));
    QDomProcessingInstruction styleInstruction = doc.createProcessingInstruction("说明", QString::fromUtf8("需要说明的内容"));
    doc.appendChild(xmlInstruction);  // 开始文档(XML 声明)
    doc.appendChild(comment);  // 注释
    doc.appendChild(styleInstruction);

    //添加根节点
    QDomElement root = doc.createElement("root");
    root.setAttribute("id", "1234");
    doc.appendChild(root);

    QDomElement name = doc.createElement("Name");
    name.setAttribute("name", QString::fromUtf8("小明")); //向Name节点中添加属性值
    root.appendChild(name); //将Name节点添加到root节点上

    QDomElement gender = doc.createElement(QString::fromUtf8("性别"));
    gender.setAttribute("gender", QString::fromUtf8("男"));
    root.appendChild(gender);

    QDomElement age = doc.createElement("Age");
    age.setAttribute(QString::fromUtf8("年龄"), "23");
    root.appendChild(age);

    QDomElement math = doc.createElement("math");
    QDomText text = doc.createTextNode(QString::fromUtf8("一百"));
    math.appendChild(text); //向math节点添加节点内容
    root.appendChild(math);

    QDomElement chinese = doc.createElement(QString::fromUtf8("语文"));
    text = doc.createTextNode("100");
    chinese.appendChild(text);
    root.appendChild(chinese);

    //删除节点
//    root.removeChild(age); //从root节点中删除子节点Age

    //保存到xml文件
    doc.save(stream, 4, QDomNode::EncodingFromTextStream);
    file.close();

    //2.读取XML文件
    file.open(QIODevice::ReadOnly);
    QDomDocument dom;
    dom.setContent(&file);
    file.close();

    QDomNodeList list = dom.childNodes();
    int iCount = list.count();
    for(int index = 0; index < iCount; index++)
    {
        QString strTemp;
        QDomNode node = list.at(index);
        if(node.nodeType() == QDomNode::ProcessingInstructionNode)
        {
            strTemp = node.toProcessingInstruction().data();
        }
        else if(QDomNode::CommentNode == node.nodeType())
        {
            strTemp = node.toComment().data();
        }
        else
        {
            strTemp = node.toElement().tagName();
        }
        qDebug() << strTemp;
    }

    QDomElement element = dom.firstChildElement(); //获取根节点
    QDomElement ageElement = element.firstChildElement("Age"); //获取名称为“Age”的第一个子节点
    qDebug() << QString::fromUtf8("年龄:") << ageElement.attribute(QString::fromUtf8("年龄"));

    QDomElement genderElement = element.firstChildElement(QString::fromUtf8("性别"));
    qDebug() << QString::fromUtf8("性别:") << genderElement.attribute("gender");

    QDomElement nameElement = element.firstChildElement("Name");
    qDebug() << QString::fromUtf8("姓名:") << nameElement.attribute("name");

    QDomElement Math = element.firstChildElement("math");
    qDebug() << QString::fromUtf8("数学:") << Math.text();

    QDomElement Chinese = Math.nextSiblingElement(); //获取Math的下一个兄弟节点
    qDebug() << QString::fromUtf8("语文:") << Chinese.text();

    return 0;
}

你可能感兴趣的:(QT)