TinyXML2解析非常糟糕

时间:2012-04-25 18:48:35

标签: android iphone xml parsing tinyxml

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

在我提出问题之前,我会说我已经成功使用了TBXML和RapidXML。特别是Rapid已经成功地解析了这个相同的文档。我熟悉XML阅读和分配值。

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

node = node-> nextSibling();

始终返回false。我了解到我可以做到这一点:

节点 - > Parent(主) - > 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-&gt; Parent() - &gt; 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();

1 个答案:

答案 0 :(得分:1)

关键是这一行: 从本质上讲,将NextSibling视为父母的一个功能,它将在下一个&#34;下一个&#34;。

虽然我手头使用的每一个XML解析器都意味着当前节点&#34;的兄弟姐妹,但TinyXML说&#34;孩子的兄弟姐妹&#34;。

一旦我习惯它,这似乎是完全自然的,但它仍然会让我陷入崩溃的循环。

示例代码位于帖子的下半部分。这个答案的存在在这样的评论中得到了解释。

见到你