2013-05-15 72 views
0

我正在使用tinyxml2在C++中的項目。 我有一個XML解析的問題,我得到一個errorID 10和錯誤消息是「XML_ERROR_PARSING_TEXT」文件加載時。tinyxml2加載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

這裏與微小的修改爲例:

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

我嘗試過了,它:

#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文檔這樣的嘗試運行良好,您只需執行在第一個參數中傳遞文件名的代碼。