1

我试图找出一种从我使用 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>

基本上,我想将文本复制<data>background仅当图层名称为"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")->FirstChildElement("layer"),如果是== "Background",得到文本。

我将如何做到这一点?

4

3 回答 3

3

我知道这个线程已经很老了,但以防万一有人在网上阅读可能会像我一样偶然发现这个问题,我想指出 Xanx 的答案可以稍微简化。

其中tinyxml2.h说对于函数const char* Attribute( const char* name, const char* value=0 ) const,如果value参数不为空,则函数仅返回 ifvaluenamematch。根据文件中的评论:

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();
}

一个小的改变,是的,但我想添加一些东西。

于 2015-02-05T01:04:04.597 回答
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();
}
于 2013-02-11T14:13:21.360 回答
1
auto bgData = text (find_element (doc, "map/layer[@name='Background']/data"));

使用tinyxml2 扩展( #include <tixml2ex.h>)。NB 真的应该被包裹在一个 try/catch 块中。正在进行的工作和文档不完整(可以从测试示例中推断出来,直到准备好)。

我会顺便提一下,其他两个答案只有在所需<layer>元素首先出现时才能正常工作。

于 2016-08-27T01:06:19.823 回答