0

编辑:我想通了,看看这个的下半部分

在我提出问题之前,我将声明我已经成功使用了 TBXML 和 RapidXML。具体来说,Rapid 已经成功地解析了这个相同的文档。我熟悉 XML 读取和赋值。

也就是说,TinyXML 和 Cocos 似乎是一个很好的组合,因为它可以编译为 android。我可以去节点一次,打印出值,看看我在哪里......问题是这样的:

节点 = 节点->nextSibling();

总是返回假。我了解到我可以这样做:

节点->父()->下一个兄弟();这将给我下一个兄弟姐妹。但这里有一个问题:

ParentNode->FirstChild() 将返回该树的第一个元素。但是如果我调用 ParentNode->NextSibling(),由于某种原因,它会返回一个指向兄弟节点的指针,除了它现在在树上更高一层。

这将使循环成为一场噩梦。

我正在搜索http://grinninglizard.com/tinyxml2docs/classtinyxml2_1_1_x_m_l_node.html以查找使用节点或元素样式(例如: NextSiblingElement() )之间的差异,但充其量,我会遇到一个失败的循环,或者只是一个碰撞。

这个解析器不像其他解析器那样工作,或者我的约定错误。我到处都放置了 cout 以查看我在哪里,并且最初的运行似乎很好。具体来说 NextSibling 正在引起问题,我想我只是不知道他们“打算”使用的树结构。

这是我现在的嵌套循环:

            for( node = node->FirstChild(); node; node = node->NextSibling() )  {
            cout << endl << node->Parent()->Value();

            for( tempElement = node->FirstChildElement(); tempNode; tempElement = tempElement->NextSibling() ) {
                //assign inner values 
                }
           //take the inner values and assign them to an object
            }

因此,虽然我的代码与遍历兄弟元素的所有建议相匹配,但它失败了。我可以从使用过它的人那里获得一些帮助,因为我在 30 分钟内使用其他系统所做的事情需要花费数小时。

另外,我相信一旦理解了“他们的方式”,它会更有意义,但我在互联网上找不到一个可行的例子。很多人建议我有示例代码(不工作)。

在大多数情况下,TinyXML 确实会找到节点和值,如果您记得要获取类型,则必须使用 node->Parent()->Value(),然后似乎不知道您在树中的位置太难。

只是为了踢,这是负载,它正在工作:

    if (doc.LoadFile(xmlFilePath.c_str()) == XML_SUCCESS)
{
    XMLNode *node = doc.RootElement();
    node = node->FirstChild(); //root 
 //....

感谢您的帮助!将不胜感激,也许是唯一一个 TinyXML2 问题,对未来的提问者有一个有效的答案,至少目前是这样。


编辑:我还不能回答,但我想通了:

为了爱......我希望我做错了什么,如果你这样做,请注意这种模式,它可以工作(TinyXML2 可能相同,我猜,只需用 XMLNode 替换 TiXmlNode):

注意:节点是指根。

本质上,将 NextSibling 视为父级上的一个函数,它在其中布置“谁是下一个”。

感谢您迄今为止的访问。这至少遍历 6 个项目(外部项目,耶!),然后我确定我现在遇到的错误是我自己的。

如果其他人需要动态遍历树,这应该对某人有所帮助。

       TiXmlNode * subNode = node->FirstChild();

    for(subNode = node ; subNode; subNode = subNode->Parent()->NextSibling()) 
    {
        subNode = subNode->FirstChild();
    cout << endl << "Parent " << subNode->Parent()->Value() << endl;

        for( tempNode = subNode; tempNode; tempNode = tempNode->Parent()->NextSibling() )
        {
            tempNode = tempNode->FirstChild();
4

1 回答 1

1

The key is this line: Essentially, think of the NextSibling as a function on the parent, where it's laying out "who's next".

While every single XML Parser I've used before hand means "Sibling of current node", TinyXML says "Sibling of the child".

It seems completely natural once I get used to it, but it still throws me for a crashing loop.

Example code is in the bottom half of the post. This answer's existence is explained in the comments of such.

See you

于 2012-05-31T17:09:41.883 回答