QT Чтение XML-файла, структура

Я использую QXmlStreamReader для обработки файла 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 всегда ложно, а blnStartElement всегда истинно.

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

0

Решение

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

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

  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;

Внутренний код выполняется только в том случае, если условие выполнено, иначе код будет пропущен.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]