2013-05-15 8 views
0

Я работаю над проектом на C++ с помощью tinyxml2. У меня проблема с разбором xml, я получаю errorID 10 и сообщение об ошибке «XML_ERROR_PARSING_TEXT» при загрузке файла.tinyxml2 load xml errorID 10

Это следующий XML в вопрос:

<Game> 
    <Window> 
    <width>600</width> 
    <height>500</height> 
    <background>joliBackgroundDeGael.jpg</background> 
    </Window> 
    <Square> 
    <Mario> 
     <size> 
     <width>30</width> 
     <height>15</height> 
     </size> 
     <speedPerFrame>5</speedPerFrame> 
     <font> 
     <stop>stopMario.jpg</stop> 
     <run>runMario.jpg</run> 
     <jump>jumpMario.jpg</jump> 
     </font> 
    </Mario> 
    </Square> 
</Game> 

Файл XML является действительным в W3C валидатор. Так что я думаю, что проблема не здесь, но, возможно, здесь:

void parseXML::getDoc() 
{ 
    this->doc.LoadFile(this->path); 
    if (this->doc.ErrorID() != 0) 
    { 
     printf("load file=[%s] failed\n", this->doc.GetErrorStr1()); 
     printf("load file=[%s] failed\n", this->doc.GetErrorStr2()); 
    } 
} 

Когда я смотрю в функции LoadFile с точки останова, я вижу, что загрузка файла такой же, как показано ниже.

Вот полный код:

#include "caracteristique.h" 
#include <iostream> 

#include <direct.h> 
#define GetCurrentDir _getcwd 

using namespace tinyxml2; 

const char* parseXML::path = "XMLType.xml"; 

void parseXML::getDoc() 
{ 
    this->doc.LoadFile(this->path); 
    if (this->doc.ErrorID() != 0) 
    { 
     printf("load file=[%s] failed\n", this->doc.GetErrorStr1()); 
     printf("load file=[%s] failed\n", this->doc.GetErrorStr2()); 
    } 
} 

int parseXML::getWindowHeight() 
{ 
    if (this->doc.Error()) 
     this->getDoc(); 

    XMLElement *root = this->doc.RootElement(); 
    if (!root) 
    { 
     XMLElement *window = root->FirstChildElement("Window"); 
     if (!window) 
      std::cout << window->FirstChildElement("height")->FirstChild()->ToText() << std::endl; 
    } 
    return 0; 
} 

идея?

Спасибо за вашу помощь,

ответ

1

Не забывайте, что нагрузка метод LoadFile и разобрать ваш файл. Если ваш файл не соответствует стандарту xml, метод завершится с ошибкой и вернет FALSE. Вы должны убедиться, что ни один из ваших атрибутов xml не содержит специальных символов, например (,), /, \. Там небольшой пример на этой странице: Tiny XML Parser Example

Вот Exemple мельчайшими изменениями:

#include "tinyxml.h" 

#include <iostream> 
#include <string> 
using namespace std; 

void Parcours(TiXmlNode* node, int level = 0) 
{ 
    cout << string(level*3, ' ') << "[" << node->Value() << "]"; 
    if (node->ToElement()) 
    { 
     TiXmlElement* elem = node->ToElement(); 
     for (const TiXmlAttribute* attr = elem->FirstAttribute(); attr; attr = attr->Next()) 
      cout << " (" << attr->Name() << "=" << attr->Value() << ")"; 
    } 
    cout << "\n";  

    for(TiXmlNode* elem = node->FirstChild(); elem; elem = elem->NextSibling()) 
     Parcours(elem, level + 1); 
} 

int main(int argc, char* argv[]) 
{ 
    TiXmlDocument doc("C:/test.xml"); 
    bool loadOkay = doc.LoadFile(); 
    if (!loadOkay) { 
     cerr << "Could not load test file. Error='" << doc.ErrorDesc() << "'. Exiting.\n"; 
     return 1; 
    } 
    Parcours(doc.RootElement()); 
} 

Вы можете попробовать его с XML-документа, как это:

<Parent> 
    <Child1 test="program" />  
    <Child2> 
     <Node number="123456789" />  
    </Child2> 
    <Child3>   
     <Hello World="!!!" /> 
    </Child3>  
</Parent> 

я попробовал его и его работала хорошо, вам нужно только выполнить код, передающий имя файла в первом аргументе.

 Смежные вопросы

  • Нет связанных вопросов^_^