当TinyXML访问者函数返回false时,为什么它停止解析同级

When TinyXML visitor function returns false, why does it stop parsing siblings?

本文关键字:为什么 访问者 TinyXML 函数 返回 false      更新时间:2023-10-16

我们采用了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来跳过其他元素类型,而不是递归地处理它们,同时仍然可以找到所有的调色板。所以我想我正在寻找一种只访问调色板元素,而完全忽略其他元素的方法。

这种行为的原因是什么?

其目的是允许您递归地搜索节点树,并在找到要查找的内容后立即停止。

我只对调色板元素感兴趣,但可能有不止一个(以及其他元素)。。。所以我想我正在寻找一种只访问调色板元素,而完全忽略其他元素的方法。

进一步的讨论意味着所有的<palette>元素都是树中某个特定节点的子节点。

Visit用于检查整个(子)树,假设您感兴趣的节点(在本例中为<palette>元素)可以在任何深度找到。

如果不是这样,那么它就不是工作的工具。

您可以使用FirstChild/LastChild/IterateChildren/等。成员函数来迭代包含所有<palette>元素的任何节点的子节点,并对实际为(经检查)<palette>元素的节点执行任何需要执行的操作,而忽略其他节点。