2016-04-09 10 views
0

Bir dosyadan veri almak için Rapidjson kullanıyorum ve oyunumdaki varlıkları oluşturmak için bu dosya verilerini kullanmak istiyorum. Dolayısıyla, dosyamın belirli bir varlığın ne olduğu (bu durumda, oluşturulacak her bir gemi parametresi ve bileşeni) tanımı vardır. (Tek bir gemi denilen Korkusuz için) aşağıdaki gibi Dosya görünür:Rapidjson ile bir dosyayı ayrıştırmak için "node" nasıl alınır?

{ 
    "dreadnought" : { 
     "parameters": { 
      "image": "data/dreadnought/dreadnought_ship.png", 
      "linearSpeed" : 10, 
      "angularSpeed" : 20, 
      "energy" : 20, 
      "hitpoints" : 50 
     }, 
     "components" : { 
      "primaryWeapon" : { 
       "name" : "fusionBlaster", 
       "energyConsumed" : 2, 
       "cooldown" : 5 
      }, 
      "secondaryWeapon" : { 
       "name" : "laserBots", 
       "energyConsumed" : 2, 
       "cooldown" : 5 
      }, 
      "ai" : { 
       "name" : "dreadnoughtAI" 
      } 
     } 
    } 
} 

İstediğim o halde ben bu değişkeni üzerinde sorgulama tutabilir, bir değişkene bir nesne olarak "gemiyi almaktan" elde etmektir. Rapidxml ile XML ayrıştırılırken yapmanız ne benzer bir şey:

xml_document<> doc; 
doc.parse<0>((char*)buffer.ToCString()); 
xml_node<>* rootNode = doc.first_node(); 

xml_node<>* innerNode = rootNode->first_node("x"); 

Anlamadığım şey olamaz innerNode olduğunu. Ben böyle bir şey isteyeyim:

Ben bu şekilde bir nesne oluşturmak için çalıştık
rapidjson::Object dreadnought; 
dreadnought.HasMember("parameters"); 
... 

, ama ben şablonu içinde koymak gerektiğini bulamıyor, ben bile bilmiyorum bu GenericObject ne olup olmadığını gerekir:

rapidjson::GenericObject<false, typename ValueT> dreadnought = m_doc["dreadnought"].GetObject(); 

Şimdiden teşekkürler.

cevap

0

Tamam, şu anda çalışabilecek bir şey buldum, ancak hala istediğim kadarı olup olmadığını kontrol etmem gerekiyor.

const rapidjson::Value &dreadnought = m_doc["dreadnought"]; 

for (rapidjson::Value::ConstMemberIterator itr = dreadnought.MemberBegin(); 
itr != dreadnought.MemberEnd(); ++itr) { 
    std::cout << "name : " << itr->name.GetString() << std::endl; 
} 

Bu şekilde, o kodu içeren işlevi çağırmak her zaman gösterir:

name : parameters 
name : components 

Yani bu istediğim budur.

+0

Nesnede anahtar/değer çiftlerini yinelemenin yolu budur. –

İlgili konular