tinyxml2加载xml errorID 10

时间:2013-05-15 10:24:40

标签: tinyxml2

我正在使用tinyxml2开发C ++项目。 我有一个xml解析的问题,我得到一个errorID 10,并且在加载文件时错误消息是“XML_ERROR_PARSING_TEXT”。

这是以下有问题的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 个答案:

答案 0 :(得分:1)

不要忘记LoadFile方法加载并解析您的文件。如果您的文件不符合xml标准,则该方法将失败并返回FALSE。您应该验证没有任何xml属性包含特殊字符,例如(,),/,\例如。该页面上有一个小例子:Tiny XML Parser Example

以下是微小修改的例子:

#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>

我尝试了它并且效果很好,你只需要在第一个参数中执行传递文件名的代码。