0

我正在使用 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;
}

一个主意 ?

谢谢你的帮助,

4

1 回答 1

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>

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

于 2014-03-13T17:10:18.163 回答