PDA

View Full Version : XML validation error



flowmaster
13th September 2010, 14:13
I have "Premateure end of document" error in at line 1 column 0 of my file, when try to validate it with XSD schema. I've tried to validate it in different software and online validators and they told me, that everything correct. So I decide, that file wasn't read correct, but it can't be cos I use it after validation. So maybe scheme wasn't reade correct? Please help me to find error.

it's part of constructor:


QFile tmlFile("..\\tml.xsd");
if (!tmlFile.open(QIODevice::ReadOnly))
{
Message::sendMessage(ERROR, "Can't find validation scheme!", "check if it's on it's place", true);
return;
}
mTmlSchema = new QXmlSchema();
if (!mTmlSchema->load(&tmlFile))
{
tmlFile.close();
Message::sendMessage(ERROR, "Validation scheme is'n valid", "use some software like Liquid XML studio to validate scheme and fix errors", true);
return;
}

ScanForObjects();
ScanForLevels();

tmlFile.close();


ScanForObjects method code:


void
XmlLoader::ScanForObjects()
{
ScanXMLForObjects("..\\Resources\\Objects.xml", &mMapsMap[GLOBAL]);
ScanXMLForObjects("..\\Resources\\LogicalObjects.xml", &mMapsMap[LOGICAL]);
ScanXMLForObjects("..\\Resources\\PhysicalObjects.xml", &mMapsMap[PHYSICAL]);
ScanXMLForObjects("..\\Resources\\GraphicalObjects.xml", &mMapsMap[GRAPHICAL]);
}


ScanXMLForObjects method code where bool isValid return false:


void
XmlLoader::ScanXMLForObjects(QString filename, elementsMap* mapToFill)
{
QXmlSchemaValidator objectsTmlValidator(*mTmlSchema);
objectsTmlValidator.setMessageHandler(this);

QDomDocument objectsDocument("Objects");
QFile objectsFile(filename);
if (!objectsFile.open(QIODevice::ReadWrite))
{
return;
}
if (!objectsDocument.setContent(&objectsFile))
{
objectsFile.close();
return;
}
bool isValid = objectsTmlValidator.validate(&objectsFile, QUrl::fromLocalFile(objectsFile.fileName()));
objectsFile.close();

QDomElement currentObjectElement =
objectsDocument.documentElement().firstChildElemen t().firstChildElement("Object");
while (!currentObjectElement.isNull())
{
(*mapToFill)[currentObjectElement.attribute("name").toStdString()] = currentObjectElement;
currentObjectElement = currentObjectElement.nextSiblingElement("Object");
}
}

wysota
13th September 2010, 16:24
Please provide a minimum compilable example reproducing the problem.

flowmaster
15th September 2010, 14:03
Ah. I thought that it's not good to place so mush code here, but:

this is header code


#pragma once

#include <QtXml/QDomElement>
#include <QtXmlPatterns/QXmlSchema>
#include <QtXmlPatterns/QAbstractMessageHandler>
#include <QtCore/QString>

#include <map>

#define gXML ::XmlLoader::getSingletone()

class XmlLoader: public QAbstractMessageHandler
{
public:
enum dataType
{
GLOBAL = 0,
LOGICAL = 1,
PHYSICAL = 2,
GRAPHICAL = 3,
DATA_TYPE_COUNT = 4
};
private:
typedef std::map<std::string, QDomElement> elementsMap;

// map of all levels, that was exist at the time of program started
std::map<dataType, elementsMap> mMapsMap;
elementsMap mLevelsMap;
QXmlSchema* mTmlSchema;

static XmlLoader* mInstance;

protected:
virtual void handleMessage(QtMsgType type,
const QString& description,
const QUrl& identifier,
const QSourceLocation& sourceLocation);

private:
XmlLoader();
void ScanForLevels();
void ScanForObjects();
void ScanXMLForObjects(QString filename, elementsMap* mapToFill);

public:
static XmlLoader* getSingletone();
QDomElement* getLevelElement(std::string name);
QDomElement* getObjectElement(dataType type, std::string name);
QStringList getAvialableLevelsList();
};


And .cpp code


#include "xml_loader.h"
//#include "message.h"

#include <QtXml/QDomDocument>
#include <QtXmlPatterns/QXmlSchemaValidator>

#include <QtCore/QFile>
#include <QtCore/QDir>
#include <QtCore/QUrl>

XmlLoader* XmlLoader::mInstance = NULL;

XmlLoader*
XmlLoader::getSingletone()
{
if (mInstance)
{
return mInstance;
}
else
{
mInstance = new XmlLoader();
return mInstance;
}
}

XmlLoader::XmlLoader()
:QAbstractMessageHandler()
{
QFile tmlFile("..\\tml.xsd");
if (!tmlFile.open(QIODevice::ReadOnly))
{
// Message::sendMessage(ERROR, "Can't find validation scheme!", "check if it's on it's place", true);
return;
}
mTmlSchema = new QXmlSchema();
if (!mTmlSchema->load(&tmlFile))
{
tmlFile.close();
// Message::sendMessage(ERROR, "Validation scheme is'n valid", "use some software like Liquid XML studio to validate scheme and fix errors", true);
return;
}

ScanForObjects();
ScanForLevels();

tmlFile.close();
}

void
XmlLoader::ScanForObjects()
{
ScanXMLForObjects("..\\Resources\\Objects.xml", &mMapsMap[GLOBAL]);
ScanXMLForObjects("..\\Resources\\LogicalObjects.xml", &mMapsMap[LOGICAL]);
ScanXMLForObjects("..\\Resources\\PhysicalObjects.xml", &mMapsMap[PHYSICAL]);
ScanXMLForObjects("..\\Resources\\GraphicalObjects.xml", &mMapsMap[GRAPHICAL]);
}

void
XmlLoader::ScanForLevels()
{
QDir levelsDir("..\\Resources\\Levels");
QStringList entryList = levelsDir.entryList(QDir::Files);

for (QStringList::iterator i = entryList.begin(); i != entryList.end(); i++)
{
QString filename = *i;
filename = "..\\Resources\\Levels\\" + filename;

QFile file(filename);
if (!file.open(QIODevice::ReadOnly))
return;

QDomDocument levelDocument("Level");
if (!levelDocument.setContent(&file))
{
file.close();
return;
}
file.close();

QDomElement levelElement = levelDocument.documentElement().firstChildElement("Level");
mLevelsMap[levelElement.attribute("name").toStdString()] = levelElement;
}

return;
}

void
XmlLoader::handleMessage(QtMsgType type,
const QString& description,
const QUrl& identifier,
const QSourceLocation& sourceLocation)
{
// code to this method was added just to have place for breakpoint
QString path = identifier.path();
return;
}

QStringList
XmlLoader::getAvialableLevelsList()
{
QStringList levelsList;
for (elementsMap::iterator i = mLevelsMap.begin(); i != mLevelsMap.end(); i++)
{
levelsList << tr(i->first.c_str());
}
return levelsList;
}

QDomElement*
XmlLoader::getLevelElement(std::string name)
{
elementsMap::iterator i = mLevelsMap.find(name);
if (i == mLevelsMap.end())
{
return NULL;
}
else
{
return &(i->second);
}
}

QDomElement*
XmlLoader::getObjectElement(dataType type, std::string name)
{
elementsMap::iterator i = mMapsMap[type].find(name);
if (i == mMapsMap[type].end())
{
return NULL;
}
else
{
return &(i->second);
}
}

void
XmlLoader::ScanXMLForObjects(QString filename, elementsMap* mapToFill)
{
QXmlSchemaValidator objectsTmlValidator(*mTmlSchema);
objectsTmlValidator.setMessageHandler(this);
bool a = objectsTmlValidator.schema().isValid();

QDomDocument objectsDocument("Objects");
QFile objectsFile(filename);
if (!objectsFile.open(QIODevice::ReadWrite))
{
return;
}

QString* errorString = new QString();
if (!objectsDocument.setContent(&objectsFile, errorString))
{
objectsFile.close();
return;
}

// HERE is my error. isValid always become false
bool isValid = objectsTmlValidator.validate(&objectsFile, QUrl::fromLocalFile(objectsFile.fileName()));
objectsFile.close();

QDomElement currentObjectElement =
objectsDocument.documentElement().firstChildElemen t().firstChildElement("Object");
while (!currentObjectElement.isNull())
{
(*mapToFill)[currentObjectElement.attribute("name").toStdString()] = currentObjectElement;
currentObjectElement = currentObjectElement.nextSiblingElement("Object");
}
}

wysota
15th September 2010, 15:38
It is not a minimal compilable example.