针对一个特定节点的rapidxml奇怪解析



我已经为我的(简单?(问题寻找了几个小时的解决方案,但我找不到遇到这个问题的人。我使用的是最新版本的rapidxml(1.13(。我目前正在尝试创建一个基于tile的引擎,我需要读取tmx文件。我使用rapidxml已经有一段时间了,到目前为止一切都很好。它能够完美地读取每个节点,并具有预期的行为。但我遇到了一个节点,它有问题。这是我的tmx文件:

<?xml version="1.0" encoding="UTF-8"?>
<map version="1.5" tiledversion="1.6.0" orientation="orthogonal" renderorder="right-down" width="100" height="100" tilewidth="32" tileheight="32" infinite="0" nextlayerid="12" nextobjectid="1">
<tileset firstgid="1" source="../../../Tile_engine/Tile_engine/sprite/[Base]BaseChip_pipo.tsx"/>
<tileset firstgid="1065" source="../../../Tile_engine/Tile_engine/sprite/collision.tsx"/>
<layer id="4" name="background" width="100" height="100">
<properties>
<property name="bg" type="bool" value="false"/>
</properties>
<data encoding="csv">
//I've removed the data for clearer view
</data>
</layer>
<layer id="6" name="object" width="100" height="100">
<properties>
<property name="isSolid" type="bool" value="true"/>
</properties>
<data encoding="csv">
//I've removed the data for clearer view
</data>
</layer>
<layer id="9" name="front" width="100" height="100">
<properties>
<property name="isSolid" type="bool" value="false"/>
</properties>
<data encoding="csv">
//I've removed the data for clearer view
</data>
</layer>
<layer id="11" name="collision" width="100" height="100">
<data encoding="csv">
//I've removed the data for clearer view
</data>
</layer>
</map>

为了调试,我使用了一个带有rapidxml:的基本读取

xml_document<> doc;
xml_node<> * root_node;
// Read the xml file into a vector
ifstream theFile ("sprites/map_wtf.tmx");
vector<char> buffer((istreambuf_iterator<char>(theFile)), istreambuf_iterator<char>());
buffer.push_back('');
// Parse the buffer using the xml file parsing library into doc
doc.parse<0>(&buffer[0]);
// Find our root node
root_node = doc.first_node("map");

当我尝试读取(并计数(节点时,例如:

int count_node(0);
for(xml_node<> * child = root_node->first_node("layer"); child != nullptr; child = child->next_sibling())
count_node++;
cout    <<  count_node;

输出正确,给我4分。但是,当我尝试读取tileset节点时,输出为6。

所以我假设该行为与/>在tileset节点(<tileset firstgid="1" source="../../../Tile_engine/Tile_engine/sprite/[Base]BaseChip_pipo.tsx"/>(的末尾。

由于嵌套的属性节点具有相同的模式(<property name="bg" type="bool" value="false"/>(,我尝试了以下代码:

int count_node(0);
for(xml_node<> * child = root_node->first_node("layer")->first_node("properties")->first_node("property"); child != nullptr; child = child->next_sibling())
count_node++;
cout    <<  count_node;

谁给了我正确的输出aka:1。

我已经为doc.parse<0>(&buffer[0])行尝试了不同的解析选项,但都不起作用。我在这些测试中也读过缓冲区的内容,它是正确的。我读取文件的方式肯定是错误的,但我不明白为什么这个脚本读取节点和属性node fine,而不是tileset

有人能帮我吗?谢谢

这个问题是基于对结果的误解

xml_node<> * child = root_node->first_node("layer");
child = child->next_sibling();

child = child->next_sibling()返回同一级别上的下一个节点,而不考虑节点名称或在root_node->first_node("layer")选择期间应用的任何其他约束。

然而,next_sibling签名与first_node签名基本相同,因此它可以用于将标准应用于要查找的下一个同级节点。

所以(未经测试的(方法就像

int count_node(0);
for(xml_node<> * child = root_node->first_node("tileset"); child != nullptr; child = child->next_sibling("tileset"))
count_node++;
cout << count_node;

相关内容

  • 没有找到相关文章

最新更新