2016-04-12 14 views
0

QXmlStreamReaderを使用してXMLファイルを処理しています。読み取りループは非常に単純です:QT XMLファイルの構造体を読み取る

if (!file.open(QFile::ReadOnly | QFile::Text)) { 
     strErrors.append(mcszConfigFile); 
     strErrors.append("\n\nDoes not exists!\n\n"); 
    } 
    xmlrdr.setDevice(&file); 
    xmlrdr.readNext(); 
    blnRootFound = false; 
    while(!xmlrdr.atEnd()) { 
     /* [Edit] This shouldn't be here! if (xmlrdr.isStartElement()) */{ 
      QXmlStreamAttributes attrs = xmlrdr.attributes(); 
      QStringRef srfNodeName = xmlrdr.name(); 
      bool blnEndElement = xmlrdr.isEndElement(); 
      bool blnStartElement = xmlrdr.isStartElement(); 
      bool blnInvalid = true; 

      if (attrs.length() > 0) { 
       QString strID, strNodeName = srfNodeName.toString(); 

       if (attrs.hasAttribute(mcszXMLattrID) == false) { 
        strErrors.append("Node: "); 
        strErrors.append(qPrintable(srfNodeName.toString())); 
        strErrors.append("Has no id!\n"); 
        break; 
       } 
       strID = attrs.value(mcszXMLattrID).toString(); 

       if (strNodeName.compare(mcszXMLnodeRoot) == 0) { 
        blnRootFound = true; 
        blnInvalid = false; 
        mstrRootID = strID; 
       } else if (strNodeName.compare(mcszXMLnodeButton) == 0 
         || strNodeName.compare(mcszXMLnodeButtonBar) == 0 
         || strNodeName.compare(mcszXMLnodeOption) == 0) { 
        blnInvalid = false; 
       } else if (strNodeName.compare(mcszXMLnodeControl) == 0) { 
        for(int t=0; mcpszValidControlTypes[t]!=NULL; t++) { 
         if (strID.compare(mcpszValidControlTypes[t]) == 0) { 
          blnInvalid = false; 
          break; 
         } 
        } 
       } 
       if (strID.length() > 0 && blnInvalid == false) { 
        clsXMLnode objNode = clsXMLnode(strNodeName, &attrs, this);      
        msmapNodes.insert(std::pair<QString, clsXMLnode>(strID, objNode)); 
        msmapAreas.insert(std::pair<QString, QRect>(strID, objNode.rctGetGeom())); 
        if (blnStartElement == true) { 

        } 
       } 
      } 
     } 
     xmlrdr.readNext(); 
    } 
    if (file.isOpen() ) { 
     file.close(); 
    } 

私が読んでいるXML:

<?xml version="1.0" encoding="utf-8"?> 
    <!-- 
    Node:   gui 
    Attrbuttes: left, right, top and bottom defines the pixel white space to allow 
        from the edge of the display 
      language, should be set to the appropriate country code, an XML file named using 
      the country code must exist, e.g. 44.xml 
    //--> 
    <gui id="root" bottom="0" left="0" right="0" top="24" language="44"> 
     <control id="trainstrip" 
      x="(center:SCREEN) - (25%:SCREEN_WIDTH)" y="(top:SCREEN)" height="40px" width="(50%:SCREEN_WIDTH)"/> 
     <control id="elevationstrip" 
       x="(left:trainstrip) - 56px" y="(top:trainstrip) + (height:trainstrip) + 24px" width="56px" height="{75%:SCREEN_HEIGHT}"/> 
     <control id="lofmimics" 
      color_arc="#ffaaaaaa" 
       color_axis="#fff0000" 
       color_bg="#ffaaaaaa" 
       color_needle="#ffffff00" 
       color_min_limit="#ffbbbb00" 
       color_max_limit="#ffcc00cc" 
       color_port="#ff00aa00" 
       color_starboard="'#ffaa0000" 
       elevation_height="275px" 
      elevation_mech_max="85" 
       elevation_mech_min="-10" 
       elevation_max="85" 
       elevation_margin_left="64px" 
       elevation_margin_bottom="64px" 
       elevation_min="-10" 
       elevation_pensize_limit="3" 
       elevation_pensize_reading="3" 
       elevation_width="[elevation_height]" 
       elevation_x="0px" 
      elevation_y="0px" 
       training_mech_starboard="170" 
       training_mech_port="-170" 
       training_pensize_port="5" 
       training_pensize_starboard="5" 
       training_pensize_limit="3" 
       training_pensize_reading="3" 
       training_starboard="150" 
       training_port="-150" 
       training_width="(left:elevationstrip)" 
       training_height="([training_width])" 
      training_x="([elevation_x])" 
      training_y="([elevation_height])" 
       x="(left:SCREEN)" 
      width="([x]:elevationstrip)" 
      height="([training_height]) + ([elevation_height])" 
       y="(bottom:SCREEN) - ([height])"/> 
     <buttonbar id="modes"  
      height="50%" 
      width="100px" 
      x="(RIGHT:SCREEN) - ([width])" 
      y="(TOP:SCREEN)" 
      title="MODE" 
      color_bg="#ffaaaaaa" 
      border="inset:#ffcccccc,#ff333333" 
      button_height="24px" 
       button_width="80px" 
      vertical_space="4px"> 
     <button id="btnsetup" color_bg="#ff3399ff" x="0px" y="{top:modes}"> 
      <option value="0" text="operate<"/> 
      <option value="1" text="setup"/> 
      <option value="2" text="install"/> 
      <option value="3" text="startup"/> 
      <option value="4" text="shutdown"/> 
     </button>  
     </buttonbar> 
    </gui> 

私がいる問題は、フラグblnEndElementとblnStartElementは正確に補正を反映して表示されないということですファイルの読み込み時には、blnEndElementは常にfalseになり、blnStartElementは常にtrueになります。

私がしたいことは、XMLを読み込んで処理しながらノード/要素階層を構築することです。

+0

これは、main whileループの後に、if条件があるからです。if(xmlrdr.isStartElement())。 – vcp

+0

@vcp、説明してください。私はデバッガの値をチェックし、blnStartElementのフラグは常にtrueです。 – SPlatten

答えて

1

私がいる問題は、フラグblnEndElementとblnStartElementがファイルを読み込むときに、正確に正しい状態を反映していないようで、blnEndElementは常に偽であるとblnStartElementは常に真であるということです。

ローカル変数blnEndElementblnStartElementの値が間違っています。私は、この動作の原因であるかの条件の下にハイライト:

while(!xmlrdr.atEnd()) { 
     if (xmlrdr.isStartElement()) { 
     //^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 
      QXmlStreamAttributes attrs = xmlrdr.attributes(); 
      QStringRef srfNodeName = xmlrdr.name(); 
      bool blnEndElement = xmlrdr.isEndElement(); 
      bool blnStartElement = xmlrdr.isStartElement(); 
      // ^^^^^^^^^^ Same as above if condition, ALWAYS be TRUE, if control reaches this line. 

      bool blnInvalid = true; 

内部コードは、条件が満たされた場合に、他のコードがスキップされますときにのみ実行されます。

+0

Doh、私はあなたが何を意味するかを正確に見ています。私はこれを完全に忘れています、ありがとう。 – SPlatten

関連する問題