Когда функция посетителя TinyXML возвращает значение false, почему она прекращает анализ братьев и сестер? - PullRequest
3 голосов
/ 09 июня 2011

Мы приняли Tiny XML в качестве нашего XML-парсера. Я пишу код для извлечения палитр из XML-файла и написал функцию посетителя следующим образом:

PALETTE_PARSER::VisitEnter( const TiXmlElement& Element, const TiXmlAttribute* First Attribute)
{
    if( Element.ValueStr() == "palette" )
    {
        AddPalette( Element );
        return( true );
    }
    else
    {
        return( false );
    }
}

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

Если вы вернете true в методе Visit, рекурсивный анализ будет продолжен. Если вы вернетесь false, дочерние узлы этого узла или его дочерние элементы не будут посещены.

Для меня имеет смысл не разбирать детей, но братья и сестры кажутся мне странными. В чем причина такого поведения? Есть ли способ заставить его делать то, что я хочу?

То есть меня интересуют только элементы палитры, но их может быть несколько (а также другие элементы). Я хотел вернуть false, чтобы пропустить другие типы элементов, а не обрабатывать их рекурсивно, по-прежнему находя все палитры. Поэтому я думаю, что я ищу способ посетить только элементы палитры, полностью игнорируя все остальное.

1 Ответ

1 голос
/ 09 июня 2011

В чем причина такого поведения?

Цель состоит в том, чтобы позволить вам рекурсивно искать дерево узлов и останавливаться, как только вы нашли то, что искали.

Меня интересуют только элементы палитры, но их может быть больше одного (а также других элементов) ... Так что я думаю, что я ищу способ посетить только элементы палитры, полностью игнорируя все остальное.

Дальнейшее обсуждение подразумевает, что все элементы <palette> являются потомками какого-то определенного узла в дереве.

Visit предназначен для проверки всего (под) дерева, при условии, что интересующие вас узлы (в данном случае <palette> элементов) могут быть найдены на любой глубине.

Если это не так, то это не инструмент для работы.

Вы можете использовать FirstChild / LastChild / IterateChildren / и т. Д. Функции-члены для перебора дочерних узлов любого узла, который содержит все элементы <palette>, и делают все, что вам нужно, с узлами, которые на самом деле являются (после проверки) элементами <palette>, и игнорируют остальные.

...