当TinyXML访问函数返回false时,为什么会停止解析兄弟节点?

3
我们采用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元素,然后就停止了。当我查阅文档时,发现如下说明:
如果您从Visit方法中返回'true',则递归解析将继续进行。如果您返回false,则此节点及其兄弟节点的任何子节点都不会被访问。
我认为不解析子节点是有道理的,但忽略兄弟节点对我来说很奇怪。这种行为的原因是什么?有没有办法使它做我想要的事情?
也就是说,我只对调色板元素感兴趣,但可能会有多个调色板元素(以及其他元素)。我希望返回false以跳过其他元素类型,而无需递归处理它们,同时仍然找到所有调色板。所以我想寻找一种只访问调色板元素,完全忽略其他元素的方法。
1个回答

1
这种行为的原因是什么?
目的是允许您递归搜索节点树,并在找到所需内容后立即停止。
我只对调色板元素感兴趣,但可能会有多个(以及其他元素)...所以我想找到一种方法,仅访问调色板元素,完全忽略其他所有内容。
进一步讨论表明,所有元素都是树中某个特定节点的子节点。
Visit用于检查整个(子)树,假设您感兴趣的节点(在这种情况下为元素)可能在任何深度找到。
如果不是这种情况,则它不是该工具的工作。
你可以使用FirstChild/LastChild/IterateChildren等成员函数来迭代包含所有<palette>元素的节点的子节点,并对实际上是(经过检查的)<palette>元素的节点执行所需的操作,忽略其他节点。

我工作时的风格是如所示的返回方式。在我的例子中,我只对palette元素感兴趣,但可能会有多个(以及其他元素)。我想返回false以跳过其他元素类型,而不必递归处理它们,同时仍然找到所有的palette - andrewdski
是的,不,是的。(调色板有子项,这些子项是调色板中的颜色。)编辑:实际上请检查一下,调色板在顶层下面一级。有一个顶层包含调色板和其他我不感兴趣的东西。 - andrewdski
换句话说,完全不使用“Accept”和访问者接口? - andrewdski
1
没错。它们用于递归遍历。显然你不需要那种,因为你不必在任意深度上找到任何东西。 - Karl Knechtel
我会编辑我的问题以更清楚地表达我的意思。如果您特别编辑您的答案以包含最后一句话,我会接受它。那说得好! - andrewdski
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接