2012-04-12 69 views
1

我試圖想出一個辦法來加載從我一直在使用TinyXML2創建的XML文檔中的文本。這是整個文件。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> 

基本上,我想將文本複製到一個名爲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(「地圖」) - > FirstChildElement(「圖層」),如果它=背景,獲取文本。

我將如何做到這一點。

謝謝!

回答

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參數不爲空,則函數只返回如果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(); 
} 

一個小的改動,是的,但我想補充一點。

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

使用tinyxml2 extension#include <tixml2ex.h>)。 N.B.應該真的被包裝在try/catch塊中。 工作進行中和文檔不完整(可以從測試示例中推導出來,直到它準備就緒)。

我一定能順利通過,當所需<layer>元素首先出現其他兩個答案只有正常工作不在話下。

相關問題