【问题标题】:TinyXML2 Parsing going very badTinyXML2 解析非常糟糕
【发布时间】:2012-05-06 12:10:51
【问题描述】:

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

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

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

node = node->nextSibling();

总是返回 false。我知道我可以这样做:

node->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->Parent()->Value(),然后知道你在树中的位置并不会似乎不太难。

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

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

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


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

为了……我希望我做错了什么,如果你这样做,请注意这个模式,它有效(TinyXML2 可能相同,我猜,只需将 TiXmlNode 替换为 XMLNode ):

注意:节点指的是根。

基本上,将 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();

【问题讨论】:

  • 我刚刚意识到,这段代码有我的元素采样...用 tempNode 替换 tempElement,你会很清楚我在大多数尝试中都在做什么
  • 更新:我只是将其更改为与 TiXMLDocument (TinyXML v1) 一起使用......同样的问题。
  • 您能否将您的解决方案移至一个答案,以便我们将其从未回答列表中删除?谢谢!
  • 啊,我对元方面还不太熟悉,抱歉。现在会做。 (24小时的限制让我如果我解决得太快就继续前进,然后我就忘记了)。谢谢

标签: android iphone xml parsing tinyxml


【解决方案1】:

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

虽然我之前使用的每一个 XML 解析器都表示“当前节点的同级”,但 TinyXML 表示“子级的同级”。

一旦我习惯了它似乎很自然,但它仍然让我陷入崩溃循环。

示例代码在帖子的下半部分。这个答案的存在在此类的 cmets 中进行了解释。

再见

【讨论】:

    猜你喜欢
    • 2023-04-01
    • 2017-01-25
    • 2018-06-27
    • 2010-09-16
    • 2021-03-11
    • 2020-08-12
    • 1970-01-01
    • 1970-01-01
    • 2011-12-19
    相关资源
    最近更新 更多