TinyXML2 перейти к следующему брату

Я не уверен, как отформатировать файл XML, так что здесь есть прямая ссылка, если он не читается в формате кода stackru.

Описание 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.
Сообщение об ошибке:

http://i.imgur.com/s5yT6nC.png

Соответствующий код: main:

 //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;
}

1 ответ

Решаемые. Он использовал один и тот же корень для 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);
}

Похоже, это исправило ситуацию, так как он ищет следующего брата дочернего элемента с именем параметра вместо того, чтобы просто автоматически брать соседнего брата.

Другие вопросы по тегам