Qt读写xml文件QDomElement

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, 4QDomNode::EncodingFromTextStream);

    file.close();

 

    return true;

}

 

3.字段访问和修改

//读取根节点

QDomElement XmlContent:: getRootNode()

{

    QDomElement root = m_dom.documentElement();

    if (root.tagName() != "Root")

        return QDomElement();

    return root;

}

 

//读取节点属性键值对

QMap<QStringQString> getNodeAttributes(QDomElement dom)

{

    if (dom.isNull())

    {

        std::cerr << "node is null" << std::endl;

        return QMap<QStringQString>();

    }

 

    QMap<QStringQString> 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<QStringQString> attribute)

{

    QDomElement root = m_dom.documentElement();

    if(root.tagName()!= "Root")

        return QDomElement();

 

    QDomElement item;

    item = m_dom.createElement(nodeName);

    root.appendChild(item);

 

    QMap<QStringQString>::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<QStringQString> attribute)

{

    if(pNode.isNull())

        return QDomElement();

 

    QDomElement item;

    item = m_dom.createElement(nodeName);

    pNode.appendChild(item);

 

    QMap<QStringQString>::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<QDomElementXmlContent::addNode(QString nodeName,QDomElement pNode,QList<QMap<QStringQString>> 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<QStringQString>::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<QStringQString> map;

                    map = getNodeAttributes(child);//读取字段属性

                    child = child.nextSiblingElement("Item");//查找下一个兄弟节点

                }

            }         

        }

 

 

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值