qtxml生成与解析

目录

xml生成:

xml解析:


xml生成:

void Qxml::setTml()
{
    QDomDocument doc;//xml文档树的创建
    //xml文档树的指令版本必有的
    QDomProcessingInstruction pi=doc.createProcessingInstruction("xml","version=\"1.0\" encoding=\"utf-8\"");
    doc.appendChild(pi);//xml文档树的添加
    QDomElement root=doc.createElement("root");//创建根元素 一般有且只有一个
    doc.appendChild(root);//xml文档树的添加
    ///<root>      大致的格式基本如此
    /// <ff00>ff0</ff00>
    /// <ff11>ff1</ff11>
    ///</root> 添加规则 *注意父元素添的是元素 *子元素一般添的是文本 依赖文档树doc对象生成
    QDomElement baotou=doc.createElement("报头");
    root.appendChild(baotou);
    QDomElement baowen=doc.createElement("报文");
    root.appendChild(baowen);
    //报头添加
    {
        QDomElement a1=doc.createElement("报头内容");
        QDomElement a1_1=doc.createElement("子内容1");
        a1_1.appendChild(doc.createTextNode("火力覆盖"));
        QDomElement a1_2=doc.createElement("子内容2");
        a1_2.appendChild(doc.createTextNode("直接打击"));
        a1.appendChild(a1_1);
        a1.appendChild(a1_2);
        QDomElement a2=doc.createElement("报头内容");
        a2.appendChild(doc.createTextNode("报头内容222"));
        QDomElement a3=doc.createElement("报头内容");
        a3.appendChild(doc.createTextNode("报头内容333"));
        baotou.appendChild(a1);
        baotou.appendChild(a2);
        baotou.appendChild(a3);
    }
    //报文
    {
        QDomElement a1=doc.createElement("报文内容");
        QDomElement a1_1=doc.createElement("子内容1");
        a1_1.appendChild(doc.createTextNode("火力覆盖"));
        QDomElement a1_2=doc.createElement("子内容2");
        a1_2.appendChild(doc.createTextNode("直接打击"));
        a1.appendChild(a1_1);
        a1.appendChild(a1_2);
        QDomElement a2=doc.createElement("报文内容");
        a2.appendChild(doc.createTextNode("报文内容222"));
        QDomElement a3=doc.createElement("报文内容");
        a3.appendChild(doc.createTextNode("报文内容333"));
        baowen.appendChild(a1);
        baowen.appendChild(a2);
        baowen.appendChild(a3);
    }
    //写入文件
    QFile fi("baowen.xml");
    if(!fi.open(QIODevice::WriteOnly|QIODevice::Text))
    {return;}
    else {
        fi.write(doc.toByteArray());
        fi.close();
        qDebug()<<"写入成功";
    }
}

xml解析:

void Qxml::getxml()
{
    QFile f("ff.xml");//
    f.open(QIODevice::ReadOnly|QIODevice::Text);
    QByteArray bytes=f.readAll();
    f.close();
    QDomDocument doc;//xml文档树
    doc.setContent(bytes);//必写如果写第二个参数可以为false,实际用的话一个参数就好了
    QDomElement root=doc.documentElement();//必写返回xml文档的根元素(xml一般有且只有一个根元素)
    ///核心:拿到元素 获取元素里面的节点 进行判断是(文本节点直接输出)是(元素节点再次进行解析)
    ///<ff11>ff1</ff11> 这就是一个元素(element) 他的节点(node)为1  节点类型是文本节点
    /// <ffff>               ffff 就是一个元素 节点为1  节点类型是 元素节点
    ///  <ff00>ff0</ff00>    ff00 是一个元素 节点为1  节点类型是  文本节点
    ///  <ff11>ff1</ff11>    ff11 是一个元素 节点为1  节点类型是  文本节点
    /// </ffff>              //解了好久悟性太差了哎
    QDomNodeList ns=root.childNodes();//获取根元素下所有同一级别 子节点 的个数
    qDebug()<<QString("root元素个数%1").arg(ns.size());
    QDomNode node=root.firstChild();//获取第一个子节点的所有节点
    if(node.isElement())
    //for(int i=0;i<ns.size();i++)//for一次处全部节点解开
    {   //如果节点是元素  就把当前节点转换成元素 继续解里面的子节点
        QDomElement el=node.toElement();
        //QDomElement el=ns.at(i).toElement();//for一次处全部节点解开
        QDomNodeList list=el.childNodes();
        qDebug()<<QString("list元素个数%1 标签名%2").arg(list.size())+el.tagName();
        for (int i = 0; i < list.size(); ++i)
        {
            QDomNode n=list.at(i);
            //判断是文本节点肯定只有一组文本 直接用当前标签对象获取 标签名和文本名
            if(n.nodeType()==QDomNode::TextNode)
            {
                //QDomText tx=n.toText();
                //qDebug()<<el.tagName()+"-标签-"+tx.nodeValue();//获取单个节点文本
                qDebug()<<el.tagName()+" "+el.text();//获取标签内全部文本
            }
            //如果是元素节点就继续解里面的子节点
            else if(n.nodeType()==QDomNode::ElementNode)
            {
                QDomElement el=n.toElement();
                QDomNodeList list=el.childNodes();
                for(int i=0;i<list.size();i++)
                {
                    QDomNode n=list.at(i);
                    if(n.nodeType()==QDomNode::TextNode)
                    {
                        //QDomText tx=n.toText();
                        //qDebug()<<el.tagName()+"-标签内-"+tx.nodeValue();
                        qDebug()<<el.tagName()+"-标签内-"+el.text();
                    }
                    else {
                        QDomElement el=n.toElement();
                        QDomNodeList list=el.childNodes();//没用使用为下一级节点做准备
                        qDebug()<<el.tagName()+" "+el.text();
                    }
                }
                //qDebug()<<el.tagName()+" "+el.text();
            }
        }
    }

}

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值