我试图想出一种从我使用TinyXML2创建的XML文档加载文本的方法。这是整个文件。
<?xml version="1.0" encoding="UTF-8"?>
<map version="1.0" orientation="orthogonal" width="15" height="13" tilewidth="32" tileheight="32">
<tileset firstgid="1" name="Background" tilewidth="32" tileheight="32">
<image source="background.png" width="64" height="32"/>
</tileset>
<tileset firstgid="3" name="Block" tilewidth="32" tileheight="32">
<image source="block.png" width="32" height="32"/>
</tileset>
<layer name="Background" width="15" height="13">
<data encoding="base64">
AgAAAAIAAAACAAAA...
</data>
</layer>
<layer name="Block" width="15" height="13">
<data encoding="base64">
AwAAAAMAAAADAAAAAwAAAAM...
</data>
</layer>
</map>
基本上,只有当图层名称为背景时,我才想将文本复制到名为background的字符串中。
我得到了其他变量:
// Get the basic information about the level
version = doc.FirstChildElement("map")->FloatAttribute("version");
orientation = doc.FirstChildElement("map")->Attribute("orientation");
mapWidth = doc.FirstChildElement("map")->IntAttribute("width");
mapHeight = doc.FirstChildElement("map")->IntAttribute("height");
这很有效,因为我知道元素名称和属性名称。有没有办法说获取doc.FirstChildElement(“map”) - &gt; FirstChildElement(“layer”),如果它= background,则获取文本。
我将如何做到这一点。
谢谢!
答案 0 :(得分:3)
我知道这个帖子已经很老了,但万一有人在浏览互联网时可能会遇到这个问题,我想指出Xanx的答案可以稍微简化一下。
在tinyxml2.h
中,它表示对于函数const char* Attribute( const char* name, const char* value=0 ) const
,如果value
参数不为null,则该函数仅在value
和name
时返回比赛。根据文件中的评论:
if ( ele->Attribute( "foo", "bar" ) ) callFooIsBar();
可以这样写:
if ( ele->Attribute( "foo" ) ) {
if ( strcmp( ele->Attribute( "foo" ), "bar" ) == 0 ) callFooIsBar();
}
因此Xanx提供的代码可以像这样重写:
XMLElement * node = doc.FirstChildElement("map")->FirstChildElement("layer");
std::string value;
if (node->Attribute("name", "Background")) // no need for strcmp()
{
value = node->FirtChildElement("data")->GetText();
}
一个微小的改变,是的,但我想添加的东西。
答案 1 :(得分:1)
我建议你做这样的事情:
XMLElement * node = doc.FirstChildElement("map")->FirstChildElement("layer");
std::string value;
// Get the Data element's text, if its a background:
if (strcmp(node->Attribute("name"), "Background") == 0)
{
value = node->FirtChildElement("data")->GetText();
}
答案 2 :(得分:0)
(count-total - count2) / count-total
使用tinyxml2 extension(auto bgData = text (find_element (doc, "map/layer[@name='Background']/data"));
)。
注:应该真的包装在try / catch块中。
正在进行的工作和文档不完整(可以从测试示例推断,直到它准备就绪)。
我顺便提一下,当首先出现所需的#include <tixml2ex.h>
元素时,其他两个答案才能正常工作。