2016-04-12 3 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 всегда истинно.

Что я хочу сделать, это создать иерархию узлов/элементов во время чтения и обработки XML.

+0

Это потому, что после основного цикла while у вас есть условие if if (xmlrdr.isStartElement()). – vcp

+0

@vcp, поясните пожалуйста. Я проверил значения в отладчике, и флаг для blnStartElement всегда прав. – SPlatten

ответ

1

Проблема у меня в том, что флаги blnEndElement и blnStartElement, кажется, не точно отражают правильные состояния при чтении файла, blnEndElement всегда ложно и blnStartElement всегда верно.

Если я правильно понял ваш вопрос правильно, вы получаете неправильные значения локальных переменных blnEndElement и blnStartElement. Я придаю ниже, если условие, которое является причиной такого поведения:

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

Дох, я понимаю, что вы имеете в виду, я пропустил это полностью, спасибо. – SPlatten

Смежные вопросы