Hello,
I try to figure out how to parse memory like a tree,I already parse with SAX
and a mem buffer inputsource and it works progressively or in one shot, but how
do i get the results ?
The thing is I added some enumeval exemple parts, hoping that I would have an
output or something but it reach the error :Non schema document, no output
available
I don't want to use DTD, I only want to be able to parse the elements of the
xml string buffer(comes from network)
i thought 1st parsefirst and parsenext would do the trick but how is it
possible to get the values of the xml tags and attributes ?
here is the code :
SAXParser* parser = new SAXParser;
parser->setValidationScheme(SAXParser::Val_Always);
parser->setDoNamespaces(true);
parser->setDoSchema(true);
//parser->setValidationSchemaFullChecking(false); ----- don't work if i
uncomment it
MemParseHandlers handler;
parser->setDocumentHandler(&handler);
parser->setErrorHandler(&handler);
MemBufInputSource* memBufIS = new MemBufInputSource((const
XMLByte*)XMLBuffer, size, gMemBufId, false);
unsigned long duration;
int errorCount = 0;
try
{
//////////////////////////////// full parse
const unsigned long startMillis = XMLPlatformUtils::getCurrentMillis();
parser->parse(*memBufIS);
const unsigned long endMillis = XMLPlatformUtils::getCurrentMillis();
duration = endMillis - startMillis;
errorCount = parser->getErrorCount();
// Create a progressive scan token
/* XMLPScanToken token;
const unsigned long startMillis = XMLPlatformUtils::getCurrentMillis();
if (!parser->parseFirst(*memBufIS, token))
{
LogPrint(MT_ERROR,"error reading XML");
XMLPlatformUtils::Terminate();
return false;
}
bool gotMore = true;
while (gotMore && !parser->getErrorCount())
gotMore = parser->parseNext(token);
const unsigned long endMillis = XMLPlatformUtils::getCurrentMillis();
duration = endMillis - startMillis;
errorCount = parser->getErrorCount();
parser->parseReset(token);*/
}
catch (const OutOfMemoryException&)
{
LogPrint(MT_ERROR,"OutOfMemoryException");
XMLPlatformUtils::Terminate();
return false;
}
catch (const XMLException& e)
{
LogPrint(MT_ERROR,"Error during parsing memory stream:Exception message
is: %s",StrX(e.getMessage()));
XMLPlatformUtils::Terminate();
return false;
}
if (!parser->getValidator().handlesSchema())
{
LogPrint(MT_ERROR," Non schema document, no output available");
return false;
}
Grammar* rootGrammar = parser->getRootGrammar();
if (!rootGrammar || rootGrammar->getGrammarType() !=
Grammar::SchemaGrammarType)
{
LogPrint(MT_ERROR," Non schema grammar, no output available" );
---------------------error comes here
----------------------------------------------
return false;
}
SchemaGrammar* grammar = (SchemaGrammar*) rootGrammar;
RefHash3KeysIdPoolEnumerator<SchemaElementDecl> elemEnum =
grammar->getElemEnumerator();
if (!elemEnum.hasMoreElements())
{
LogPrint(MT_ERROR,"The validator has no elements to display");
return false;
}
//DTDValidator* valToUse = new DTDValidator;
// Print out the stats that we collected and time taken.
if (!errorCount)
{
while(elemEnum.hasMoreElements())
{
const SchemaElementDecl& curElem = elemEnum.nextElement();
// Name
LogPrint(MT_INFO,"Name:\t\t\t%s",StrX(curElem.getFullName()));
// Model Type
LogPrint(MT_INFO,"Model Type:\t\t",StrX(curElem.getFullName()));
switch( curElem.getModelType() )
{
case SchemaElementDecl::Empty: LogPrint(MT_INFO,"Empty");
break;
case SchemaElementDecl::Any: LogPrint(MT_INFO,"Any");
break;
case SchemaElementDecl::Mixed_Simple: LogPrint(MT_INFO,"Mixed_Simple");
break;
case SchemaElementDecl::Mixed_Complex: LogPrint(MT_INFO,"Mixed_Complex");
break;
...
...
please help me, it seems so easy to do but I been looking for two days already
thx alot
good night folks