RapidXML - как я могу обрабатывать отсутствующие узлы/значения

Я хотел бы читать из XML в C++, используя RapidXML. Однако, если узел не существует или значение отсутствует, программа аварийно завершает работу.

for (rapidxml::xml_node<> * xmlasset_node = root_node->first_node("Asset"); xmlasset_node; xmlasset_node = xmlasset_node->next_sibling())
{mystring += xmlasset_node->first_attribute("name")->value()};

Однако этот атрибут «имя» существует не во всех узлах и должен быть заполнен значением по умолчанию, если оно не в XML. Подобно этому, у меня есть некоторые подузлы не во всех узлах. Причина в том, чтобы сделать XML как можно меньше и четче для ручной корректировки.

Как можно реализовать проверку/тестирование (C++), чтобы предотвратить сбой программы и простое использование значений по умолчанию, если значение/узел не существует?

С уважением, - Корак


person Corak55    schedule 14.05.2014    source источник


Ответы (1)


Вот что я делаю, вы можете сравнить, соответствует ли значение узла и его атрибута вашим критериям, тогда вы его принимаете: // в основном я ищу узел «настройки», затем подузел «сеть», затем атрибут «порт»

  if( boost::iequals(doc.first_node()->next_sibling()->name(), "settings"))
        {
            for (xml_node<> *node = doc.first_node()->next_sibling()->first_node(); node; node = node->next_sibling())
            {

                // find network tag 
                if (boost::iequals(node->name(),"network"))
                {

                    for (xml_attribute<> *attr = node->first_attribute(); attr; attr = attr->next_attribute())
                    {
                        if ( boost::iequals(attr->name(), "port"))
                        {
                            strcpy(attr->value(), portname);
                        }
                    }
                }
          }
    }
person Samer    schedule 14.05.2014
comment
Спасибо Samer, с вашим подходом я решил проблему! Дело закрыто :) - person Corak55; 14.05.2014
comment
@Corak55 Corak55 Добро пожаловать ... Не могли бы вы принять ответ :) - person Samer; 15.05.2014
comment
Привет, Самер, конечно. Я совсем новичок здесь, поэтому, пожалуйста, извините:) Это правильно (зеленая метка)? С уважением - Корак - person Corak55; 16.05.2014