编辑:我想通了,看看这个的下半部分
在我提出问题之前,我将声明我已经成功使用了 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();