コード例 #1
0
ファイル: xmltree.c プロジェクト: camilorodegheri/AwaLWM2M
// Parse an xml document
// -- Creates and sets up an xml parser context
// -- Parses xml doc body into a DOM tree
// -- Destroys the xml parser context when done
// doc should be a char* to the xml document
// length should be the length of th xml document
// whole doc should be set to true if the entire xml doc is contained in the string pointed to by doc
TreeNode TreeNode_ParseXML(uint8_t* doc, uint32_t length, bool wholeDoc)
{
    TreeNode root = NULL;
    if (doc)
    {
        if (length)
        {
            XMLParser_Context bodyParser = XMLParser_Create();
            XMLParser_SetStartHandler(bodyParser, HTTP_xmlDOMBuilder_StartElementHandler);
            XMLParser_SetCharDataHandler(bodyParser, HTTP_xmlDOMBuilder_CharDataHandler);
            XMLParser_SetEndHandler(bodyParser, HTTP_xmlDOMBuilder_EndElementHandler);
            XMLParser_SetUserData(bodyParser, &root);
            if (XMLParser_Parse(bodyParser, (const char*) doc, length, wholeDoc))
            {
                // Parsed ok
            }
            else
            {
                // Parsing failed
                // Clean up tree
                Tree_Delete(root);
                root = NULL;
            }
            XMLParser_Destroy (bodyParser);
            currentTreeNode = NULL;
        }
    }
    return root;
}
コード例 #2
0
ファイル: xmlreader.c プロジェクト: LiberatorUSA/GUCEF
int XMLReader_Parse(struct XMLReader_t *r, LPFNINPUTSRC inputSrc, void *inputData, 
					const XMLCH *encoding)
{
	if (r->errorcode) r->errorcode=0;
	if (r->eventbuffer->length) /* clean up in the next _Read is necessary */
		r->eventbufferpos = r->eventbuffer->length;
	return (r->dtdv) ?
		XMLParser_ParseValidateDTD(r->dtdv, r->parser, inputSrc, inputData, encoding) :
		XMLParser_Parse(r->parser, inputSrc, inputData, encoding);
}
コード例 #3
0
ファイル: xmlreader.c プロジェクト: LiberatorUSA/GUCEF
void XMLReader_AbortParse(struct XMLReader_t *r)
{	
	/* supress error reporting by removing errorHandler 
	before calling parse(NULL) so we don't get
	ERR_XMLP_UNCLOSED_TAG etc. errors. parser->ErrorCode
	will be set though */
	XML_ERROR_HANDLER h = r->parser->errorHandler;
	r->parser->errorHandler = NULL;
	XMLParser_Parse(r->parser, NULL, NULL, NULL);
	r->parser->errorHandler = h;
}
コード例 #4
0
int main(int argc, char* argv[])
{	
	LPXMLPARSER parser;		
	int depth = 0;

	if (!XMLParser_Create(&parser)) {
		printf("Error creating parser!\n");
		return 1;
	}

	parser->errorHandler = ErrorHandler;
	parser->startElementHandler = StartElement;
	parser->endElementHandler = EndElement;	
	parser->UserData = &depth;

	if (!XMLParser_Parse(parser, cstream, stdin, 0))
		printf("Error: %s\nLine: %d Col: %d\n", 
			parser->ErrorString, parser->ErrorLine, parser->ErrorColumn);
			
	XMLParser_Free(parser);
	return 0;
}
コード例 #5
0
ファイル: xmltest.c プロジェクト: LiberatorUSA/GUCEF
int RunTest(XMLCONFPARSER *xcp, char *uri) 
{
	LPXMLRUNTIMEATT att, tatt;
	XMLCH testuri[MAX_PATH];
	XMLCH xmlbase[MAX_PATH];
	XMLCH id[256];
	XMLCH *s;
	FILE *f;
	RUNPARSERDATA rdata;
	int result, expect;
	LPXMLPARSER parser = xcp->runParser;
	int type;

	if ((s = XMLParser_GetPrefixMapping(xcp->parser, "xml:base")))
		strcpy(xmlbase, s); /* we save current xmlbase
							   (although it shouldn't get modified 'cos
							   main parser isn't running during RunTest()) */
	else {
		/* rmt-e2e-18: 
		External entity containing start of entity declaration is 
		base URI for system identifier, so:  */
		XMLCH *sysID = XMLParser_GetSystemID(xcp->parser);
		if (!sysID) xmlbase[0] = '\0';
		else GetBaseDir(sysID, xmlbase);
	}
	
	strcpy(testuri, xmlbase);
	strcat(testuri, uri);

	puts(testuri);
	
	/* resolve basedir for external entities, DTD and for canonxml */
	GetBaseDir(testuri, rdata.testbasedir);
	
	tatt = XMLParser_GetNamedItem(xcp->parser, "TYPE");
	if (tatt) {
		/* "Nonvalidating parsers must also accept "invalid" testcases,
       but validating ones must reject them." */
		if (!strcmp(tatt->value, "valid")) type = TYPE_VALID;
		else if (!strcmp(tatt->value, "invalid")) type = TYPE_INVALID;
		else type = TYPE_OTHER; /* error, not-wf */
	}

	if ((f = fopen(testuri, "rb"))) {
#ifdef TEST_VALIDATING		
		xcp->v->UserData = &rdata;
		xcp->v->UserFlag = type;
		xcp->v->startElementHandlerFilter = StartElementDetermineValidation;
		result = XMLParser_ParseValidateDTD(xcp->v, parser, cstream, f, 0);
#else	
		parser->UserData = &rdata; 
		result = XMLParser_Parse(parser, cstream, f, 0);
#endif
		fclose(f);
	}
	else {
		fprintf(PFERR, "Error opening file %s\n", testuri);
		return 0;
	}

	xcp->testCount++;

	/* 1 row columns: ID, TYPE, PASS/FAIL, ERRORSTRING 
	   2 row columns: ENTITIES + OUTPUT in one col, 3 empty cols
	   3 row: test description, 3 empty cols
	*/	
	att = XMLParser_GetNamedItem(xcp->parser, "ID");
	strcpy(id, (att) ? att->value : "unknown");
	fputs((xcp->testCount % 2) ? "<tr bgcolor='#EEEEEE'>" : "<tr>", xcp->pfout);	
	fprintf(xcp->pfout, "<td><a href='%s'>%s</a></td>", testuri, id); 
	
	if (tatt) {
		if (type == TYPE_VALID) expect = 1; 
		else if (type == TYPE_INVALID)
#ifdef TEST_VALIDATING
			expect = 0;
#else
			expect = 1; 
#endif
		else expect = 0;
		fprintf(xcp->pfout, "<td>%s</td>", tatt->value);
		if (result == expect) xcp->testSuccess++;
	}
コード例 #6
0
ファイル: dtdvalid.c プロジェクト: acekiller/TotemBalance
int XMLAPI XMLParser_ParseValidateDTD(LPXMLDTDVALIDATOR dtd, LPXMLPARSER parser,
			LPFNINPUTSRC inputSrc, void *inputData, const XMLCH *encoding)
{
	int ret;
	if (!dtd || !parser) return 0;

	if (!inputSrc)
		ret = (parser->ErrorCode==0);
	else {
		dtd->parser = parser;
		dtd->ErrorCode = dtd->ErrorColumn = dtd->ErrorLine = 0; /* must be
			set before FreeDTDValidator */
		if (*dtd->ErrorString) dtd->ErrorString[0] = '\0';

		if (dtd->ContextStack->length) 
			_XMLVector_RemoveAll(dtd->ContextStack);
		
		if (dtd->cpNodesPool) {
			FreeDTDValidator(dtd, 1);
			if (dtd->ErrorCode) return 0;
		}	
		dtd->ElementTable = NULL;
		dtd->cpNodesPool = NULL;
		dtd->idTable = NULL;
		
		/* save handlers: */
		dtd->startElementHandler = parser->startElementHandler;
		dtd->endElementHandler = parser->endElementHandler;
		dtd->charactersHandler = parser->charactersHandler;
		dtd->ignorableWhitespaceHandler = parser->ignorableWhitespaceHandler;	
		dtd->elementDeclHandler = parser->elementDeclHandler;
		dtd->endDTDHandler = parser->endDTDHandler;
		/* set the validating ones: */
		parser->startElementHandler = dtd->startElementHandlerFilter;
		parser->endElementHandler = dtd->endElementHandlerFilter;
		parser->charactersHandler = dtd->charactersHandlerFilter;
		parser->ignorableWhitespaceHandler = dtd->ignorableWhitespaceHandlerFilter;
		parser->elementDeclHandler = DTDValidate_ElementDecl;
		parser->endDTDHandler = DTDValidate_EndDTD;	
		
		_XMLParser_SetFlag(parser, XMLFLAG_REPORT_DTD_EXT, 1);
		parser->UserData = dtd;

		ret = XMLParser_Parse(parser, inputSrc, inputData, encoding);
		if (ret && _XMLParser_GetFlag(parser, XMLFLAG_USE_SIMPLEPULL)) return 1;
	}
	
	if (!ret) {
		/* Assign ElementTable and content particle pool 'cos validator 
		will be responsible for freeing them and endDTD might not be called */
		if (dtd->ElementTable!=parser->prt->cpNames)
			dtd->ElementTable = parser->prt->cpNames;
		if (dtd->cpNodesPool!=parser->prt->cpNodesPool)
			dtd->cpNodesPool = parser->prt->cpNodesPool;
	}
	else if (dtd->idTable) {
		dtd->idTable->userdata = dtd;
		XMLHTable_Destroy(dtd->idTable, CheckIDREFS, 0);
		dtd->idTable = NULL;
		ret = (parser->ErrorCode==0);
	}
	
	if (parser->prt->doctypeStr) {
		free(parser->prt->doctypeStr);
		parser->prt->doctypeStr = NULL;
	}

	_XMLParser_SetFlag(parser, XMLFLAG_REPORT_DTD_EXT, 0);
	
	/* restore handlers: */
	parser->startElementHandler = dtd->startElementHandler;
	parser->endElementHandler = dtd->endElementHandler;
	parser->charactersHandler = dtd->charactersHandler;
	parser->ignorableWhitespaceHandler = dtd->ignorableWhitespaceHandler;
	parser->elementDeclHandler = dtd->elementDeclHandler;
	parser->endDTDHandler = dtd->endDTDHandler;	
	return ret;
}