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.hfunctionconst char* Attribute( const char* name, const char* value=0 ) constの場合、valueパラメーターが null でない場合、関数は if と match のみを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();
}

マイナーな変更、はい、しかし私が追加したかったもの。

于 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 ブロックでラップする必要があります。進行中の作業とドキュメントが不完全です (準備が整うまで、テスト例から推測できます)。

他の 2 つの回答は、目的の<layer>要素が最初に表示された場合にのみ適切に機能することをお伝えします。

于 2016-08-27T01:06:19.823 に答える