如果属性匹配,则为TinyXML2查询文本

时间:2012-04-12 01:15:34

标签: c++ xml tinyxml2

我试图想出一种从我使用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,则获取文本。

我将如何做到这一点。

谢谢!

3 个答案:

答案 0 :(得分:3)

我知道这个帖子已经很老了,但万一有人在浏览互联网时可能会遇到这个问题,我想指出Xanx的答案可以稍微简化一下。

tinyxml2.h中,它表示对于函数const char* Attribute( const char* name, const char* value=0 ) const,如果value参数不为null,则该函数仅在valuename时返回比赛。根据文件中的评论:

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 extensionauto bgData = text (find_element (doc, "map/layer[@name='Background']/data")); )。 注:应该真的包装在try / catch块中。 正在进行的工作和文档不完整(可以从测试示例推断,直到它准备就绪)。

我顺便提一下,当首先出现所需的#include <tixml2ex.h>元素时,其他两个答案才能正常工作。