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

4

1 回答 1

1

这种行为的原因是什么?

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

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

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

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

如果不是这种情况,那么它就不是工作的工具。

你可以使用FirstChild///等LastChildIterateChildren成员函数来迭代包含所有<palette>元素的任何节点的子节点,并对实际上是(根据检查)元素的节点执行您需要做的任何事情<palette>,并忽略其他节点。

于 2011-06-09T00:32:53.957 回答