Чтение массива данных из XML

#c #xml #game-development #tinyxml

#c #xml #разработка игр #tinyxml

Вопрос:

Я выгружаю массив данных из объекта с в XML-файл. Как я могу получить данные из их атрибута (в моем случае имя атрибута — «Данные») и сохранить результат в каком-либо буфере для дальнейшей обработки данных?

Я использую библиотеку TinyXML.

Функция сохранения объекта (см. Результат в формате XML ниже)

 TiXmlDocument doc("text.xml"); if (!doc.LoadFile())  return false;  TiXmlHandle hDoc(amp;doc); TiXmlElement* elem; TiXmlHandle hRoot(0);  elem = hDoc.FirstChildElement().Element(); if (!elem) return false; std::string name = elem-gt;Value(); hRoot = TiXmlHandle(elem);  TiXmlElement* chunkbranch = new TiXmlElement("ChunkBranch"); root-gt;LinkEndChild(chunkbranch);  for (int x = 0; x lt; this-gt;mapChunk.size(); x  ) {  for (int y = 0; y lt; this-gt;mapChunk[x].size(); y  )  {  TiXmlElement* chunk;  chunk = new TiXmlElement("Chunk");  chunkbranch-gt;LinkEndChild(chunk);  chunk-gt;SetAttribute("posX", x);  chunk-gt;SetAttribute("posY", y);   TiXmlElement* chunkdata;  chunkdata = new TiXmlElement("ChunkData");  chunk-gt;LinkEndChild(chunkdata);  chunkdata-gt;SetAttribute("data", this-gt;mapChunk[x][y]-gt;getChunkAsString().c_str());  //maybe can be use some other method for saving data?  } }  

Здесь я называю атрибут «ChunkData». Здесь пытаюсь получить значения массива «ChunkBranch» gt;gt;gt; «ChunkData» gt; gt; gt; gt; gt; gt; данные

 elem = hRoot.FirstChild("ChunkBranch").FirstChild().Element();  for (elem; elem; elem = elem-gt;NextSiblingElement()) {  std::string buff("");  buff = elem-gt;Value();   if (buff == "Chunk")  {  int buffX;  int xKey = elem-gt;QueryIntAttribute("posX", amp;buffX);  int yKey = elem-gt;QueryIntAttribute("posY", amp;buffX);  this-gt;mapChunk[xKey][yKey] = amp;Chunk(sf::Vector2f(xKey,yKey));  std::cout lt;lt; "In chunk:t" lt;lt; xKey lt;lt; " x " lt;lt; yKeylt;lt; "n";   TiXmlElement* cData;  cData = elem-gt;FirstChildElement("ChunkData");   int test;  const char* pKey = cData-gt;Value();  const char* xke = cData-gt;GetText();  cData-gt;QueryIntAttribute("data", amp;test);//lt;lt; somewhere here the   //program doesn't return array  //and pKey = 0 (not NULL, just 0), after loading it will stop  

XML-данные

 lt;?xml version="1.0" ?gt; lt;basegt;  lt;ChunkBranchgt;  lt;Chunk posX="0" posY="0"gt;  lt;ChunkData data="0 19 0 0 0 0 0 19 0 0 0 0 0 0 19 19 0 0 0 0 0 " /gt;  lt;/Chunkgt;  lt;Chunk posX="0" posY="1"gt;  lt;ChunkData data="0 0 0 0 0 0 0 0 19 0 0 0 0 0 19 0 0 0 0 0 0 19 19 0 0 0 0 0 "/gt;  lt;/ChunkBranchgt; lt;/basegt;  

Комментарии:

1. Ваш вопрос заключается в том, как вы сохраняете XML-данные или как вы их загружаете?

2. как загрузить данные из XML-файла в некоторый буфер для дальнейшей работы с данными

3. всегда ли существует только одна ветвь, содержащая много фрагментов, и каждый фрагмент содержит один фрагмент данных? Или может быть более одного ответвления?

4. да, есть один фрагмент, в котором может быть больше «Фрагментов» с одним «фрагментом данных», я хочу извлечь данные из атрибута «Данные» во временный буфер, но не знаю, как это сделать

5. По какой-либо конкретной причине вы используете TinyXML-1, а не TinyXML-2?