Я не уверен, как отформатировать файл XML, поэтому Вот является прямой ссылкой, если она не читается в формате кода стека и потока.
Описание XML:
тест = корень
имя = ребенок теста
numofIndx -> dwellms = дочерние элементы имени
индекс = ребенок теста
- <test>
- <name index="2-6">
<numOfIndx>5</numOfIndx>
<freqStart>1.0</freqStart>
<freqStop>49.405</freqStop>
<numOfPoints>75</numOfPoints>
<attenuation>10</attenuation>
<dwellms>10</dwellms>
</name>
- <index number="2">
<freqStart>1.0</freqStart>
<freqStep>0.1</freqStep>
<level>-16</level>
<numOfPoints>8</numOfPoints>
</index>
+ <index number="3">
<freqStart>1.8</freqStart>
<freqStep>0.1</freqStep>
<level>-9</level>
<numOfPoints>2</numOfPoints>
</index>
+ <index number="4">
<freqStart>2.0</freqStart>
<freqStep>0.1</freqStep>
<level>-1</level>
<numOfPoints>1</numOfPoints>
</index>
+ <index number="5">
<freqStart>2.1</freqStart>
<freqStep>0.1</freqStep>
<level>-1</level>
<numOfPoints>4</numOfPoints>
</index>
+ <index number="6">
<freqStart>2.5</freqStart>
<freqStep>0.795</freqStep>
<level>-1</level>
<numOfPoints>60</numOfPoints>
</index>
- <name index="14-15">
<numOfIndx>2</numOfIndx>
<freqStart>705.45203</freqStart>
<freqStop>900</freqStop>
<numOfPoints>392</numOfPoints>
<attenuation>55</attenuation>
<dwellms>10</dwellms>
</name>
+ <index number="14">
<freqStart>705</freqStart>
<freqStep>0.5</freqStep>
<level>-60</level>
<numOfPoints>41</numOfPoints>
</index>
+ <index number="15">
<freqStart>725</freqStart>
<freqStep>0.5</freqStep>
<level>-50</level>
<numOfPoints>351</numOfPoints>
</index>
</test>
Я пытаюсь прочитать данные XML в структуру. В настоящее время у меня нет проблем с чтением всех данных из индекса = «2-6». Однако я не могу перейти к index = «14-15» во втором цикле. Я пытался отладить, но я не могу понять, почему мой «переход к следующему братскому коду» работает правильно для «индексных» братьев и сестер, но не для «именных» братьев и сестер.
Когда я запускаю свой код, 2-й цикл (i = 1) завершается неудачно, когда getAttr пытается вернуть pElement, который имеет значение NULL.
Сообщение об ошибке:
Соответствующий код:
главный:
//Fill test structure loop
for (int i{ 0 }; i < 2; i++)
{
test[i].testName = xml.getAttr("name", "index", i);
test[i].noi = xml.getInt("name", "numOfIndx", i);
test[i].freqStart = xml.getFloat("name", "freqStart", i);
test[i].freqStop = xml.getFloat("name", "freqStop", i);
test[i].points = xml.getInt("name", "numOfPoints", i);
test[i].att = xml.getInt("name", "attenuation", i);
test[i].dwel = xml.getInt("name", "dwellms", i);
for (int j{ 0 }; j < test[i].noi; j++)
{
temp = xml.getAttr("index", "number", j);
test[i].idx[j].index = atoi(temp);
test[i].idx[j].freqStart = xml.getFloat("index", "freqStart", j);
test[i].idx[j].freqStep = xml.getFloat("index", "freqStep", j);
test[i].idx[j].level = xml.getInt("index", "level", j);
test[i].idx[j].points = xml.getInt("index", "numOfPoints", j);
}
}
xml.getAttr / float / int, по сути, одинаковы, поэтому я просто опубликую getAttr
GetAttr:
const char * myXML::getAttr(const char * child, const char * attr, int sibNum)
{
//Locate root
XMLNode *pRoot{ findRoot() };
if (pRoot == nullptr) { return "Error"; }
XMLElement* pElement{ pRoot->FirstChildElement(child) };
//If child has identical sibling
for (int i{ 0 }; i < sibNum; i++)
{
//Find that sibling number
//pElement = nextRel(pElement);
pElement = pElement->NextSiblingElement();
}
if (pElement == nullptr || NULL) { return "Error"; }
return pElement->Attribute(attr);
}
FindRoot ():
XMLNode * myXML::findRoot()
{
XMLNode * pRoot{ doc.FirstChild() };
if (pRoot == nullptr) { return nullptr; }
return pRoot;
}
Решаемые. Он использовал тот же корень для i = 0 и i = 1, но следующий элемент родного брата изменится, когда i = 1, потому что следующий родной элемент — «index». Я изменил код, как показано ниже:
const char * myXML::getAttr(const char * child, const char * attr, int sibNum)
{
//Locate root
XMLNode *pRoot{ findRoot() };
if (pRoot == nullptr) { return "Error"; }
XMLElement* pElement{ pRoot->FirstChildElement(child) };
//If child has identical sibling
for (int i{ 0 }; i < sibNum; i++)
{
//Find that sibling number
//pElement = nextRel(pElement);
pElement = pElement->NextSiblingElement(child);
}
if (pElement == nullptr || NULL) { return "Error"; }
return pElement->Attribute(attr);
}
Похоже, это исправило ситуацию, так как он ищет следующего брата дочернего элемента с именем параметра вместо того, чтобы просто автоматически брать соседнего брата.