📄 xml.c
字号:
Z_STRVAL_PP(myval) = erealloc(Z_STRVAL_PP(myval),newlen+1); strcpy(Z_STRVAL_PP(myval) + Z_STRLEN_PP(myval),decoded_value); Z_STRLEN_PP(myval) += decoded_len; efree(decoded_value); } else { add_assoc_string(*(parser->ctag),"value",decoded_value,0); } } else { zval *tag; MAKE_STD_ZVAL(tag); array_init(tag); _xml_add_to_info(parser,parser->ltags[parser->level-1] + parser->toffset); add_assoc_string(tag,"tag",parser->ltags[parser->level-1] + parser->toffset,1); add_assoc_string(tag,"value",decoded_value,0); add_assoc_string(tag,"type","cdata",1); add_assoc_long(tag,"level",parser->level); zend_hash_next_index_insert(Z_ARRVAL_P(parser->data),&tag,sizeof(zval*),NULL); } } else { efree(decoded_value); } } }}/* }}} *//* {{{ _xml_processingInstructionHandler() */void _xml_processingInstructionHandler(void *userData, const XML_Char *target, const XML_Char *data){ xml_parser *parser = (xml_parser *)userData; if (parser && parser->processingInstructionHandler) { zval *retval, *args[3]; args[0] = _xml_resource_zval(parser->index); args[1] = _xml_xmlchar_zval(target, 0, parser->target_encoding); args[2] = _xml_xmlchar_zval(data, 0, parser->target_encoding); if ((retval = xml_call_handler(parser, parser->processingInstructionHandler, 3, args))) { zval_dtor(retval); efree(retval); } }}/* }}} *//* {{{ _xml_defaultHandler() */void _xml_defaultHandler(void *userData, const XML_Char *s, int len){ xml_parser *parser = (xml_parser *)userData; if (parser && parser->defaultHandler) { zval *retval, *args[2]; args[0] = _xml_resource_zval(parser->index); args[1] = _xml_xmlchar_zval(s, len, parser->target_encoding); if ((retval = xml_call_handler(parser, parser->defaultHandler, 2, args))) { zval_dtor(retval); efree(retval); } }}/* }}} *//* {{{ _xml_unparsedEntityDeclHandler() */void _xml_unparsedEntityDeclHandler(void *userData, const XML_Char *entityName, const XML_Char *base, const XML_Char *systemId, const XML_Char *publicId, const XML_Char *notationName){ xml_parser *parser = (xml_parser *)userData; if (parser && parser->unparsedEntityDeclHandler) { zval *retval, *args[6]; args[0] = _xml_resource_zval(parser->index); args[1] = _xml_xmlchar_zval(entityName, 0, parser->target_encoding); args[2] = _xml_xmlchar_zval(base, 0, parser->target_encoding); args[3] = _xml_xmlchar_zval(systemId, 0, parser->target_encoding); args[4] = _xml_xmlchar_zval(publicId, 0, parser->target_encoding); args[5] = _xml_xmlchar_zval(notationName, 0, parser->target_encoding); if ((retval = xml_call_handler(parser, parser->unparsedEntityDeclHandler, 6, args))) { zval_dtor(retval); efree(retval); } }}/* }}} *//* {{{ _xml_notationDeclHandler() */void _xml_notationDeclHandler(void *userData, const XML_Char *notationName, const XML_Char *base, const XML_Char *systemId, const XML_Char *publicId){ xml_parser *parser = (xml_parser *)userData; if (parser && parser->notationDeclHandler) { zval *retval, *args[5]; args[0] = _xml_resource_zval(parser->index); args[1] = _xml_xmlchar_zval(notationName, 0, parser->target_encoding); args[2] = _xml_xmlchar_zval(base, 0, parser->target_encoding); args[3] = _xml_xmlchar_zval(systemId, 0, parser->target_encoding); args[4] = _xml_xmlchar_zval(publicId, 0, parser->target_encoding); if ((retval = xml_call_handler(parser, parser->notationDeclHandler, 5, args))) { zval_dtor(retval); efree(retval); } }}/* }}} *//* {{{ _xml_externalEntityRefHandler() */int _xml_externalEntityRefHandler(XML_Parser parserPtr, const XML_Char *openEntityNames, const XML_Char *base, const XML_Char *systemId, const XML_Char *publicId){ xml_parser *parser = XML_GetUserData(parserPtr); int ret = 0; /* abort if no handler is set (should be configurable?) */ if (parser && parser->externalEntityRefHandler) { zval *retval, *args[5]; args[0] = _xml_resource_zval(parser->index); args[1] = _xml_xmlchar_zval(openEntityNames, 0, parser->target_encoding); args[2] = _xml_xmlchar_zval(base, 0, parser->target_encoding); args[3] = _xml_xmlchar_zval(systemId, 0, parser->target_encoding); args[4] = _xml_xmlchar_zval(publicId, 0, parser->target_encoding); if ((retval = xml_call_handler(parser, parser->externalEntityRefHandler, 5, args))) { convert_to_long(retval); ret = Z_LVAL_P(retval); efree(retval); } else { ret = 0; } } return ret;}/* }}} *//* {{{ _xml_startNamespaceDeclHandler() */void _xml_startNamespaceDeclHandler(void *userData,const XML_Char *prefix, const XML_Char *uri){ xml_parser *parser = (xml_parser *)userData; if (parser && parser->startNamespaceDeclHandler) { zval *retval, *args[3]; args[0] = _xml_resource_zval(parser->index); args[1] = _xml_xmlchar_zval(prefix, 0, parser->target_encoding); args[2] = _xml_xmlchar_zval(uri, 0, parser->target_encoding); if ((retval = xml_call_handler(parser, parser->startNamespaceDeclHandler, 3, args))) { zval_dtor(retval); efree(retval); } }}/* }}} *//* {{{ _xml_endNamespaceDeclHandler() */void _xml_endNamespaceDeclHandler(void *userData, const XML_Char *prefix){ xml_parser *parser = (xml_parser *)userData; if (parser && parser->endNamespaceDeclHandler) { zval *retval, *args[2]; args[0] = _xml_resource_zval(parser->index); args[1] = _xml_xmlchar_zval(prefix, 0, parser->target_encoding); if ((retval = xml_call_handler(parser, parser->endNamespaceDeclHandler, 2, args))) { zval_dtor(retval); efree(retval); } }}/* }}} *//************************* EXTENSION FUNCTIONS *************************//* {{{ proto resource xml_parser_create([string encoding]) Create an XML parser */PHP_FUNCTION(xml_parser_create){ xml_parser *parser; int argc; zval **encodingArg; XML_Char *encoding; argc = ZEND_NUM_ARGS(); if (argc > 1 || zend_get_parameters_ex(argc, &encodingArg) == FAILURE) { WRONG_PARAM_COUNT; } if (argc == 1) { convert_to_string_ex(encodingArg); /* The supported encoding types are hardcoded here because * we are limited to the encodings supported by expat/xmltok. */ if (strncasecmp(Z_STRVAL_PP(encodingArg), "ISO-8859-1", Z_STRLEN_PP(encodingArg)) == 0) { encoding = "ISO-8859-1"; } else if (strncasecmp(Z_STRVAL_PP(encodingArg), "UTF-8", Z_STRLEN_PP(encodingArg)) == 0) { encoding = "UTF-8"; } else if (strncasecmp(Z_STRVAL_PP(encodingArg), "US-ASCII", Z_STRLEN_PP(encodingArg)) == 0) { encoding = "US-ASCII"; } else { /* UTF-16 not supported */ php_error_docref(NULL TSRMLS_CC, E_WARNING, "unsupported source encoding \"%s\"", Z_STRVAL_PP(encodingArg)); RETURN_FALSE; } } else { encoding = XML(default_encoding); } parser = ecalloc(sizeof(xml_parser), 1); parser->parser = XML_ParserCreate(encoding); parser->target_encoding = encoding; parser->case_folding = 1; parser->object = NULL; parser->isparsing = 0; XML_SetUserData(parser->parser, parser); ZEND_REGISTER_RESOURCE(return_value,parser,le_xml_parser); parser->index = Z_LVAL_P(return_value);}/* }}} *//* {{{ proto resource xml_parser_create_ns([string encoding [, string sep]]) Create an XML parser */PHP_FUNCTION(xml_parser_create_ns){ xml_parser *parser; int argc; zval **encodingArg, **sepArg; XML_Char *encoding, *sep; argc = ZEND_NUM_ARGS(); if (argc > 2 || zend_get_parameters_ex(argc, &encodingArg, &sepArg) == FAILURE) { WRONG_PARAM_COUNT; } if (argc >= 1) { convert_to_string_ex(encodingArg); /* The supported encoding types are hardcoded here because * we are limited to the encodings supported by expat/xmltok. */ if (strncasecmp(Z_STRVAL_PP(encodingArg), "ISO-8859-1", Z_STRLEN_PP(encodingArg)) == 0) { encoding = "ISO-8859-1"; } else if (strncasecmp(Z_STRVAL_PP(encodingArg), "UTF-8", Z_STRLEN_PP(encodingArg)) == 0) { encoding = "UTF-8"; } else if (strncasecmp(Z_STRVAL_PP(encodingArg), "US-ASCII", Z_STRLEN_PP(encodingArg)) == 0) { encoding = "US-ASCII"; } else { /* UTF-16 not supported */ php_error_docref(NULL TSRMLS_CC, E_WARNING, "unsupported source encoding \"%s\"", Z_STRVAL_PP(encodingArg)); RETURN_FALSE; } } else { encoding = XML(default_encoding); } if (argc == 2){ convert_to_string_ex(sepArg); sep = Z_STRVAL_PP(sepArg); } else { sep = ":"; } parser = ecalloc(sizeof(xml_parser), 1); parser->parser = XML_ParserCreateNS(encoding, sep[0]); parser->target_encoding = encoding; parser->case_folding = 1; parser->object = NULL; XML_SetUserData(parser->parser, parser); ZEND_REGISTER_RESOURCE(return_value,parser,le_xml_parser); parser->index = Z_LVAL_P(return_value);}/* }}} *//* {{{ proto int xml_set_object(resource parser, object &obj) Set up object which should be used for callbacks */PHP_FUNCTION(xml_set_object){ xml_parser *parser; zval **pind, **mythis; if (ZEND_NUM_ARGS() != 2 || zend_get_parameters_ex(2, &pind, &mythis) == FAILURE) { WRONG_PARAM_COUNT; } if (Z_TYPE_PP(mythis) != IS_OBJECT) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "Argument 2 has wrong type"); RETURN_FALSE; } ZEND_FETCH_RESOURCE(parser,xml_parser *,pind, -1, "XML Parser", le_xml_parser); /* please leave this commented - or ask thies@thieso.net before doing it (again) */#ifdef ZEND_ENGINE_2 if (parser->object) { zval_ptr_dtor(&parser->object); }#endif parser->object = *mythis; /* please leave this commented - or ask thies@thieso.net before doing it (again) *//* #ifdef ZEND_ENGINE_2 zval_add_ref(&parser->object); #endif */ RETVAL_TRUE;}/* }}} *//* {{{ proto int xml_set_element_handler(resource parser, string shdl, string ehdl) Set up start and end element handlers */PHP_FUNCTION(xml_set_element_handler){ xml_parser *parser; zval **pind, **shdl, **ehdl; if (ZEND_NUM_ARGS() != 3 || zend_get_parameters_ex(3, &pind, &shdl, &ehdl) == FAILURE) { WRONG_PARAM_COUNT; } ZEND_FETCH_RESOURCE(parser,xml_parser *,pind, -1, "XML Parser", le_xml_parser); xml_set_handler(&parser->startElementHandler, shdl); xml_set_handler(&parser->endElementHandler, ehdl); XML_SetElementHandler(parser->parser, _xml_startElementHandler, _xml_endElementHandler); RETVAL_TRUE;}/* }}} *//* {{{ proto int xml_set_character_data_handler(resource parser, string hdl) Set up character data handler */PHP_FUNCTION(xml_set_character_data_handler){ xml_parser *parser; zval **pind, **hdl; if (ZEND_NUM_ARGS() != 2 || zend_get_parameters_ex(2, &pind, &hdl) == FAILURE) { WRONG_PARAM_COUNT; } ZEND_FETCH_RESOURCE(parser,xml_parser *, pind, -1, "XML Parser", le_xml_parser); xml_set_handler(&parser->characterDataHandler, hdl); XML_SetCharacterDataHandler(parser->parser, _xml_characterDataHandler); RETVAL_TRUE;}/* }}} *//* {{{ proto int xml_set_processing_instruction_handler(resource parser, string hdl) Set up processing instruction (PI) handler */PHP_FUNCTION(xml_set_processing_instruction_handler){ xml_parser *parser; zval **pind, **hdl; if (ZEND_NUM_ARGS() != 2 || zend_get_parameters_ex(2, &pind, &hdl) == FAILURE) { WRONG_PARAM_COUNT; } ZEND_FETCH_RESOURCE(parser,xml_parser *, pind, -1, "XML Parser", le_xml_parser); xml_set_handler(&parser->processingInstructionHandler, hdl); XML_SetProcessingInstructionHandler(parser->parser, _xml_processingInstructionHandler); RETVAL_TRUE;}/* }}} *//* {{{ proto int xml_set_default_handler(resource parser, string hdl) Set up default handler */PHP_FUNCTION(xml_set_default_handler){ xml_parser *parser; zval **pind, **hdl; if (ZEND_NUM_ARGS() != 2 || zend_get_parameters_ex(2, &pind, &hdl) == FAILURE) { WRONG_PARAM_COUNT; } ZEND_FETCH_RESOURCE(parser,xml_parser *, pind, -1, "XML Parser", le_xml_parser); xml_set_handler(&parser->defaultHandler, hdl); XML_SetDefaultHandler(parser->parser, _xml_defaultHandler);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -