ntl381281541的个人空间 https://blog.eetop.cn/510998 [收藏] [复制] [分享] [RSS]

空间首页 动态 记录 日志 相册 主题 分享 留言板 个人资料

日志

Qt 用DOM解析XML语言的一个例子

已有 3935 次阅读| 2011-1-11 13:41

注:这是我08年刚工作时做Qt的一个例子,从我的sina博客搬迁过来大的

这是我刚试着解析XML的程序,可以得到正确结果,紧做参考;

xml

<GANGLIA_XML VERSION="3.0.7" SOURCE="gmetad">
<GRID NAME="unspecified" AUTHORITY="http://cluster.hpc.org/ganglia/" LOCALTIME="1244949273">
<CLUSTER NAME="Our Cluster" LOCALTIME="1244949263" WNER="SDSC" LATLONG="N32.87 W117.22" URL="http://www.place.org/">
<HOST NAME="compute-0-2.local" IP="10.10.9.252" REPORTED="1244949243" TN="29" TMAX="20" DMAX="0" LOCATION="0,2,0" GMOND_STARTED="1244941563">
<METRIC NAME="mtu" VAL="16436" TYPE="uint32" UNITS="" TN="18" TMAX="1200" DMAX="0" SLOPE="both" SOURCE="gmond"/>
<METRIC NAME="machine_type" VAL="x86_64" TYPE="string" UNITS="" TN="18" TMAX="1200" DMAX="0" SLOPE="zero" SOURCE="gmond"/>
<METRIC NAME="disk_free" VAL="143.519" TYPE="double" UNITS="GB" TN="18" TMAX="180" DMAX="0" SLOPE="both" SOURCE="gmond"/>
<METRIC NAME="bytes_out" VAL="377.67" TYPE="float" UNITS="bytes/sec" TN="18" TMAX="300" DMAX="0" SLOPE="both" SOURCE="gmond"/>
<METRIC NAME="proc_total" VAL="152" TYPE="uint32" UNITS=" " TN="18" TMAX="950" DMAX="0" SLOPE="both" SOURCE="gmond"/>
<METRIC NAME="ps-1" VAL="cmd=init, user=root, %cpu=0.00, %mem=0.01, size=36, data=108, shared=580, vm=10324" TYPE="string" UNITS="" TN="49" TMAX="120" DMAX="120" SLOPE="zero" SOURCE="gmetric"/>
<METRIC NAME="ps-6" VAL="cmd=ksoftirqd/1, user=root, %cpu=0.00, %mem=0.00, size=0, data=0, shared=0, vm=0" TYPE="string" UNITS="" TN="49" TMAX="120" DMAX="120" SLOPE="zero" SOURCE="gmetric"/>
<METRIC NAME="pkts_in" VAL="0.55" TYPE="float" UNITS="packets/sec" TN="18" TMAX="300" DMAX="0" SLOPE="both" SOURCE="gmond"/>
<METRIC NAME="cpu_nice" VAL="0.0" TYPE="float" UNITS="%" TN="18" TMAX="90" DMAX="0" SLOPE="both" SOURCE="gmond"/>
<METRIC NAME="cpu_speed" VAL="2327" TYPE="uint32" UNITS="MHz" TN="18" TMAX="1200" DMAX="0" SLOPE="zero" SOURCE="gmond"/>
<METRIC NAME="boottime" VAL="1244941486" TYPE="uint32" UNITS="s" TN="18" TMAX="1200" DMAX="0" SLOPE="zero" SOURCE="gmond"/>
<METRIC NAME="ps-3" VAL="cmd=ksoftirqd/0, user=root, %cpu=0.00, %mem=0.00, size=0, data=0, shared=0, vm=0" TYPE="string" UNITS="" TN="49" TMAX="120" DMAX="120" SLOPE="zero" SOURCE="gmetric"/>
<METRIC NAME="ps-8" VAL="cmd=migration/2, user=root, %cpu=0.00, %mem=0.00, size=0, data=0, shared=0, vm=0" TYPE="string" UNITS="" TN="166" TMAX="120" DMAX="120" SLOPE="zero" SOURCE="gmetric"/>
<METRIC NAME="cpu_wio" VAL="0.0" TYPE="float" UNITS="%" TN="18" TMAX="90" DMAX="0" SLOPE="both" SOURCE="gmond"/>
<METRIC NAME="sys_clock" VAL="1244949243" TYPE="uint32" UNITS="s" TN="18" TMAX="1200" DMAX="0" SLOPE="zero" SOURCE="gmond"/>
<METRIC NAME="load_one" VAL="0.00" TYPE="float" UNITS=" " TN="18" TMAX="70" DMAX="0" SLOPE="both" SOURCE="gmond"/>
<METRIC NAME="disk_total" VAL="154.012" TYPE="double" UNITS="GB" TN="18" TMAX="1200" DMAX="0" SLOPE="both" SOURCE="gmond"/>
<METRIC NAME="cpu_idle" VAL="100.0" TYPE="float" UNITS="%" TN="18" TMAX="90" DMAX="0" SLOPE="both" SOURCE="gmond"/>
<METRIC NAME="cpu_user" VAL="0.0" TYPE="float" UNITS="%" TN="18" TMAX="90" DMAX="0" SLOPE="both" SOURCE="gmond"/>
<METRIC NAME="swap_free" VAL="1020116" TYPE="uint32" UNITS="KB" TN="18" TMAX="180" DMAX="0" SLOPE="both" SOURCE="gmond"/>
                                                 .................................................................................................................................................................................

<METRIC NAME="part_max_used" VAL="18.9" TYPE="float" UNITS="%" TN="6460" TMAX="180" DMAX="0" SLOPE="both" SOURCE="gmond"/>
</HOST>
</CLUSTER>
</GRID>
</GANGLIA_XML>



void MainWindow::openFile()
{
        readFile("localhost.xml");
}
void MainWindow::readFile(const QString &fileName)
{
 QFile opmlFile( fileName );
    if (!opmlFile.open(QFile::ReadOnly | QFile::Text))
    {
        QMessageBox::critical( 0,
                tr( "Critical Error" ),
                tr( "Cannot open file %1" ).arg( fileName ) );
    }

   QDomDocument domTree;
    if ( !domTree.setContent( &opmlFile ) )
    {
        QMessageBox::critical( 0,
                tr( "Critical Error" ),
                tr( "Parsing error for file %1" ).arg( fileName ) );
        opmlFile.close();
    }
    opmlFile.close();

    // get the header information from the DOM
    QDomElement root = domTree.documentElement();

                                            pareHostElement(root);

}
void MainWindow::pareHostElement(const QDomElement &element)
{
    // create the tree view out of the DOM
    QDomNode node = element.firstChild();
    while ( !node.isNull() )
    {
        if ( node.toElement().tagName() == "GRID")
        {
            model->setData( model->index(0,0,QModelIndex()), 5);
            QDomElement body = node.toElement();
            getHeaderInformation(body);
            //buildTree(node.toElement());
           // break;
        }
        node = node.nextSibling();
    }

}

void MainWindow::getHeaderInformation( const QDomElement &header )
{
    // visit all children of the header element and look if you can make
    // something with it
    QDomNode node = header.firstChild();
    while ( !node.isNull() )
    {
        if ( node.isElement() )
        {
            // case for the different header entries
            if ( node.toElement().tagName() == "CLUSTER" )
             {

               QDomElement child = node.toElement();
               getSecondInformation(child);

            }
        }
        node = node.nextSibling();
    }
}
void MainWindow::getSecondInformation( const QDomElement &host )
{
 int i=0;

    QDomNode hostNode = host.firstChild();
    while ( !hostNode.isNull() )
    {
        if (hostNode.toElement().tagName() == "HOST" && (hostNode.toElement().attribute("NAME")=="compute-0-2.local"))
        {
            QDomElement hostElement = hostNode.toElement();
            i=0;
        }
        else if (hostNode.toElement().tagName() == "HOST" && (hostNode.toElement().attribute("NAME")=="cluster.local"))
        {
            QDomElement hostElement = hostNode.toElement();
            i=1;
        }
        else if (hostNode.toElement().tagName() == "HOST" && (hostNode.toElement().attribute("NAME")=="compute-0-1.local"))
        {
            QDomElement hostElement = hostNode.toElement();
            i=3;
         }
        QDomElement hostElement = hostNode.toElement();
        buildTree(hostElement.toElement(),i);
        hostNode = hostNode.nextSibling();
    }

}

void MainWindow::buildTree(const QDomElement &parentElement,int i)
{
    //QStandardItemModel *thisItem = 0;
    QDomNode node = parentElement.firstChild();
    QString str;
    double dat=0.0;
    while ( !node.isNull() )
    {
        if ( node.toElement().tagName() == "METRIC" )
        {
            // add a new list view item for the outline
            if(node.toElement().attribute("NAME")=="bytes_out")
            {

             str=node.toElement().attribute("VAL");
             dat=str.toDouble();
             dat=dat/100.0;
            model->setData( model->index(i,8,QModelIndex()),dat);
            }

           else  if(node.toElement().attribute("NAME")=="bytes_in")
           {
             str=node.toElement().attribute("VAL");
           dat=str.toDouble();
            dat=dat/100.0;
            model->setData( model->index(i,9,QModelIndex()),dat);
           }
           else  if(node.toElement().attribute("NAME")=="cpu_user")
           {
             str=node.toElement().attribute("VAL");
             dat=str.toDouble();
             dat=dat/10.0;
            model->setData( model->index(i,0,QModelIndex()), dat);
 else  if(node.toElement().attribute("NAME")=="pkts_in")
           {
             str=node.toElement().attribute("VAL");
             dat=str.toDouble();
             dat=dat;
            model->setData( model->index(i,11,QModelIndex()), dat);
           }
           else  if(node.toElement().attribute("NAME")=="pkts_out")
           {
             str=node.toElement().attribute("VAL");
             dat=str.toDouble();
             dat=dat;
            model->setData( model->index(i,10,QModelIndex()), dat);

            }
            buildTree( node.toElement(),i);
        }
        node = node.nextSibling();
    }
}

点赞

评论 (0 个评论)

facelist

您需要登录后才可以评论 登录 | 注册

  • 关注TA
  • 加好友
  • 联系TA
  • 0

    周排名
  • 0

    月排名
  • 0

    总排名
  • 0

    关注
  • 1

    粉丝
  • 0

    好友
  • 0

    获赞
  • 1

    评论
  • 184

    访问数

小黑屋| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-6-14 06:37 , Processed in 0.025169 second(s), 14 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
返回顶部