2012-04-12 5 views
1

Я пытаюсь выяснить способ загрузки текста из XML-документа, который я создал с помощью TinyXML2. Вот весь документ.Текст запроса TinyXML2, если атрибут соответствует

<?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> 

В принципе, я хочу скопировать текст из строки, называемой фоном, только если имя слоя является фоном.

Я получил другие переменные, как так:

// 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»), а если он = фон, получите текст.

Как бы это осуществить.

Спасибо!

ответ

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

Я знаю, что эта нить довольно старый, но только в том случае, если кто просматривал Интернет может наткнуться на этот вопрос, как я есть, я хотел бы отметить, что ответ Xanx можно упростить.

В tinyxml2.h он говорит, что для функции const char* Attribute(const char* name, const char* value=0) const, если параметр value не равно нулю, то функция возвращает только если 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(); 
} 

Незначительные изменения , да, но кое-что, что я хотел добавить.

0
auto bgData = text (find_element (doc, "map/layer[@name='Background']/data")); 

tinyxml2 extension Используя (#include <tixml2ex.h>). N.B. должен действительно быть завернут в блок try/catch. Незавершенная работа и документация неполная (может быть выведено из тестового примера, пока она не будет готова).

Помещаю попутно, что остальные два ответа работают только тогда, когда сначала появляется нужный элемент .