我正在使用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;
}
一个想法?
感谢您的帮助,
答案 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>
我尝试了它并且效果很好,你只需要在第一个参数中执行传递文件名的代码。