当前位置: 代码迷 >> 综合 >> Qt读写xml文件QDomElement
  详细解决方案

Qt读写xml文件QDomElement

热度:16   发布时间:2024-02-06 08:57:06.0

Qt提供了QDomElement 类用于完成对xml文件的读取和写入。

  1. 读文件

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");//查找下一个兄弟节点

                }

            }         

        }