xml — C ++ RapidXML получить одного и того же типа?

Итак, в RapidXML я пытаюсь перебрать свой файл, чтобы получить данные из некоторых tileset узлы:

rapidxml::xml_node<> *root_node = doc.first_node("map");
for(rapidxml::xml_node<> *tileset = root_node->first_node("tileset");
tileset != 0; tileset = tileset->next_sibling("tileset"))
{
// Iteration stuff...

Вы, наверное, говорите, в чем проблема? Ну, в RapidXML, next_sibling() функция по выбору соответствует имени:

xml_node<Ch>* next_sibling(const Ch *name=0, std::size_t name_size=0, bool
case_sensitive=true) const;

Gets next sibling node, optionally matching node name. Behaviour is undefined
if node has no parent. Use parent() to test if node has a parent.

Следовательно, если узел не найден с именем, он просто вернет следующего родного брата независимо от этого. Это проблема в моей программе, и я просто не хочу дополнительной итерации. Я думаю, что это глупо, но что угодно. Есть ли способ сделать это ТОЛЬКО перебрать мой tileset узлы?

0

Решение

«необязательно совпадающее имя узла» — как в параметре необязательно. Если вы передадите строку имени, и она не найдена, вы получите нулевое возвращаемое значение.

xml_node<Ch> *next_sibling(const Ch *name = 0, std::size_t name_size = 0, bool case_sensitive = true) const
{
assert(this->m_parent);     // Cannot query for siblings if node has no parent
if (name)
{
if (name_size == 0)
name_size = internal::measure(name);
for (xml_node<Ch> *sibling = m_next_sibling; sibling; sibling = sibling->m_next_sibling)
if (internal::compare(sibling->name(), sibling->name_size(), name, name_size, case_sensitive))
return sibling;
return 0;
}
else
return m_next_sibling;
}
2

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

У меня также была эта проблема, и я использовал эту небольшую модификацию в качестве обходного пути, которая работает как задумано.

rapidxml::xml_node<> *root_node = doc.first_node("map");
for(rapidxml::xml_node<> *tileset = root_node->first_node("tileset");
tileset != 0;
tileset = tileset->next_sibling())
{
if(strcmp(tileset->name(), "tileset")!=0)
continue;

//TODO: the usual loop contents
}
0

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