📄 php_domxml.c
字号:
PHPAPI zval *php_domobject_new(xmlNodePtr obj, int *found, zval *wrapper_in TSRMLS_DC){ zval *wrapper; char *content; int rsrc_type; *found = 0; if (!obj) { if(!wrapper_in) { MAKE_STD_ZVAL(wrapper); } else wrapper = wrapper_in; ZVAL_NULL(wrapper); return wrapper; } if ((wrapper = (zval *) dom_object_get_data((void *) obj))) { zval_add_ref(&wrapper); *found = 1; return wrapper; } if(!wrapper_in) { MAKE_STD_ZVAL(wrapper); } else wrapper = wrapper_in; switch (Z_TYPE_P(obj)) { case XML_ELEMENT_NODE: { xmlNodePtr nodep = obj; if(!wrapper_in) object_init_ex(wrapper, domxmlelement_class_entry); rsrc_type = le_domxmlelementp; add_property_long(wrapper, "type", Z_TYPE_P(nodep)); add_property_stringl(wrapper, "tagname", (char *) nodep->name, strlen(nodep->name), 1); break; } case XML_TEXT_NODE: { xmlNodePtr nodep = obj; if(!wrapper_in) object_init_ex(wrapper, domxmltext_class_entry); rsrc_type = le_domxmltextp; content = xmlNodeGetContent(nodep); add_property_long(wrapper, "type", Z_TYPE_P(nodep)); add_property_stringl(wrapper, "name", "#text", 5, 1); if (content) add_property_stringl(wrapper, "content", (char *) content, strlen(content), 1); xmlFree(content); break; } case XML_COMMENT_NODE: { xmlNodePtr nodep = obj; if(!wrapper_in) object_init_ex(wrapper, domxmlcomment_class_entry); rsrc_type = le_domxmlcommentp; content = xmlNodeGetContent(nodep); if (content) { add_property_long(wrapper, "type", Z_TYPE_P(nodep)); add_property_stringl(wrapper, "name", "#comment", 8, 1); add_property_stringl(wrapper, "content", (char *) content, strlen(content), 1); xmlFree(content); } break; } case XML_PI_NODE: { xmlNodePtr nodep = obj; if(!wrapper_in) object_init_ex(wrapper, domxmlpi_class_entry); rsrc_type = le_domxmlpip; content = xmlNodeGetContent(nodep); add_property_stringl(wrapper, "name", (char *) nodep->name, strlen(nodep->name), 1); if (content) { add_property_stringl(wrapper, "value", (char *) content, strlen(content), 1); xmlFree(content); } break; } case XML_ENTITY_REF_NODE: { xmlNodePtr nodep = obj; if(!wrapper_in) object_init_ex(wrapper, domxmlentityref_class_entry); rsrc_type = le_domxmlentityrefp; add_property_stringl(wrapper, "name", (char *) nodep->name, strlen(nodep->name), 1); break; } case XML_ENTITY_DECL: case XML_ELEMENT_DECL: { xmlNodePtr nodep = obj; if(!wrapper_in) object_init_ex(wrapper, domxmlnode_class_entry); rsrc_type = le_domxmlnodep; add_property_long(wrapper, "type", Z_TYPE_P(nodep)); add_property_stringl(wrapper, "name", (char *) nodep->name, strlen(nodep->name), 1); if (Z_TYPE_P(obj) == XML_ENTITY_REF_NODE) { content = xmlNodeGetContent(nodep); if (content) { add_property_stringl(wrapper, "content", (char *) content, strlen(content), 1); xmlFree(content); } } break; } case XML_ATTRIBUTE_NODE: { xmlAttrPtr attrp = (xmlAttrPtr) obj; if(!wrapper_in) object_init_ex(wrapper, domxmlattr_class_entry); rsrc_type = le_domxmlattrp; add_property_long(wrapper, "type", Z_TYPE_P(attrp)); add_property_stringl(wrapper, "name", (char *) attrp->name, strlen(attrp->name), 1); content = xmlNodeGetContent((xmlNodePtr) attrp); if (content) { add_property_stringl(wrapper, "value", (char *) content, strlen(content), 1); xmlFree(content); } break; } case XML_DOCUMENT_NODE: case XML_HTML_DOCUMENT_NODE: { xmlDocPtr docp = (xmlDocPtr) obj; if(!wrapper_in) object_init_ex(wrapper, domxmldoc_class_entry); rsrc_type = le_domxmldocp; if (docp->name) add_property_stringl(wrapper, "name", (char *) docp->name, strlen(docp->name), 1); else add_property_stringl(wrapper, "name", "#document", 9, 1); if (docp->URL) add_property_stringl(wrapper, "url", (char *) docp->URL, strlen(docp->URL), 1); else add_property_stringl(wrapper, "url", "", 0, 1); if (docp->version) add_property_stringl(wrapper, "version", (char *) docp->version, strlen(docp->version), 1); else add_property_stringl(wrapper, "version", "", 0, 1); if (docp->encoding) add_property_stringl(wrapper, "encoding", (char *) docp->encoding, strlen(docp->encoding), 1); add_property_long(wrapper, "standalone", docp->standalone); add_property_long(wrapper, "type", Z_TYPE_P(docp)); add_property_long(wrapper, "compression", docp->compression); add_property_long(wrapper, "charset", docp->charset); break; } /* FIXME: nodes of type XML_DTD_NODE used to be domxmldtd_class_entry. * but the DOM Standard doesn't have a DomDtd class. The DocumentType * class seems to be want we need and the libxml dtd functions are * very much like the methods of DocumentType. I wonder what exactly * is the difference between XML_DTD_NODE and XML_DOCUMENT_TYPE_NODE. * Something like * <!DOCTYPE chapter SYSTEM '/share/sgml/Norman_Walsh/db3xml10/db3xml10.dtd' * [ <!ENTITY sp \"spanish\"> * ]> * is considered a DTD by libxml, but from the DOM perspective it * rather is a DocumentType */ case XML_DTD_NODE: case XML_DOCUMENT_TYPE_NODE: { xmlDtdPtr dtd = (xmlDtdPtr) obj; if(!wrapper_in) object_init_ex(wrapper, domxmldoctype_class_entry);/* rsrc_type = le_domxmldtdp; */ rsrc_type = le_domxmldoctypep;/* add_property_long(wrapper, "type", Z_TYPE_P(dtd)); */ add_property_long(wrapper, "type", XML_DOCUMENT_TYPE_NODE); if (dtd->ExternalID) add_property_string(wrapper, "publicId", (char *) dtd->ExternalID, 1); else add_property_string(wrapper, "publicId", "", 1); if (dtd->SystemID) add_property_string(wrapper, "systemId", (char *) dtd->SystemID, 1); else add_property_string(wrapper, "systemId", "", 1); if (dtd->name) add_property_string(wrapper, "name", (char *) dtd->name, 1); break; } case XML_CDATA_SECTION_NODE: { xmlNodePtr nodep = obj; if(!wrapper_in) object_init_ex(wrapper, domxmlcdata_class_entry); rsrc_type = le_domxmlcdatap; content = xmlNodeGetContent(nodep); add_property_long(wrapper, "type", Z_TYPE_P(nodep)); if (content) { add_property_stringl(wrapper, "content", (char *) content, strlen(content), 1); xmlFree(content); } break; } case XML_NAMESPACE_DECL: { xmlNodePtr nodep = obj; if(!wrapper_in) object_init_ex(wrapper, domxmlns_class_entry); rsrc_type = le_domxmlnamespacep; add_property_long(wrapper, "type", Z_TYPE_P(nodep)); add_property_stringl(wrapper, "name", (char *) nodep->name, strlen(nodep->name), 1); content = xmlNodeGetContent(nodep->children); if (content) { add_property_stringl(wrapper, "value", (char *) content, strlen(content), 1); xmlFree(content); } break; } default: php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unsupported node type: %d\n", Z_TYPE_P(obj)); FREE_ZVAL(wrapper); return NULL; } php_dom_set_object(wrapper, (void *) obj, rsrc_type TSRMLS_CC); return (wrapper);}static void domxml_error(void *ctx, const char *msg, ...){ char buf[1024]; va_list ap; TSRMLS_FETCH(); va_start(ap, msg); vsnprintf(buf, 1024, msg, ap); va_end(ap); php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s", buf);}static void domxml_error_ext(void *ctx, const char *msg, ...){ xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx; xmlParserInputPtr input = NULL; char buf[1024]; va_list ap; TSRMLS_FETCH(); va_start(ap, msg); vsnprintf(buf, 1024, msg, ap); va_end(ap); if (ctxt != NULL && ctxt->_private != NULL) { zval *errormessages; MAKE_STD_ZVAL(errormessages); if(array_init(errormessages) != SUCCESS) { /* do error handling here */ } add_assoc_string(errormessages,"errormessage",buf,1); input = ctxt->input; if (ctxt->name) { add_assoc_string(errormessages,"nodename",(char *) ctxt->name,1); } if (input != NULL) { add_assoc_long(errormessages,"line",input->line); add_assoc_long(errormessages,"col",input->col); if (input->filename != NULL) { add_assoc_string(errormessages,"directory",(char *) input->directory,1); add_assoc_string(errormessages,"file",(char *) input->filename,1); } } add_next_index_zval(ctxt->_private,errormessages); } php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s", buf); }static void domxml_error_validate(void *ctx, const char *msg, ...){ domxml_ErrorCtxt *ctxt ; char buf[1024]; va_list ap; TSRMLS_FETCH(); va_start(ap, msg); vsnprintf(buf, 1024, msg, ap); va_end(ap); ctxt = (domxml_ErrorCtxt*) ctx; if (ctxt != NULL && ctxt->errors != NULL) { zval *errormessages; MAKE_STD_ZVAL(errormessages); if(array_init(errormessages) != SUCCESS) { /* do error handling here */ } if (ctxt->parser != NULL) { if (ctxt->parser->name) { add_assoc_string(errormessages,"nodename",(char *)ctxt->parser->name,1); } if (ctxt->parser->input != NULL) { add_assoc_long(errormessages,"line",ctxt->parser->input->line); add_assoc_long(errormessages,"col",ctxt->parser->input->col); if (ctxt->parser->input->filename != NULL) { add_assoc_string(errormessages,"directory",(char *) ctxt->parser->input->directory,1); add_assoc_string(errormessages,"file",(char *) ctxt->parser->input->filename,1); } } } if (ctxt->valid->node != NULL) { /*php_error_docref(NULL TSRMLS_CC, E_WARNING,"nodename %s",(char *) ctxt->valid->name); node = *ctxt->node;*/ } add_assoc_string(errormessages,"errormessage",buf,1); add_next_index_zval(ctxt->errors,errormessages); } php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s", buf); }PHP_RINIT_FUNCTION(domxml){ xmlSetGenericErrorFunc(xmlGenericErrorContext, (xmlGenericErrorFunc)domxml_error);#if HAVE_DOMXSLT xsltSetGenericErrorFunc(xsltGenericErrorContext, (xmlGenericErrorFunc)domxml_error);#endif return SUCCESS;}PHP_RSHUTDOWN_FUNCTION(domxml){ xmlSetGenericErrorFunc(xmlGenericErrorContext, NULL);#if HAVE_DOMXSLT xsltSetGenericErrorFunc(xsltGenericErrorContext, NULL);#endif return SUCCESS;}PHP_MSHUTDOWN_FUNCTION(domxml){#if HAVE_DOMXSLT xsltCleanupGlobals();#endif xmlCleanupParser();/* If you want do find memleaks in this module, compile libxml2 with --with-mem-debug and uncomment the following line, this will tell you the amount of not freed memory and the total used memory into apaches error_log *//* xmlMemoryDump(); */ return SUCCESS;}PHP_MINIT_FUNCTION(domxml){ zend_class_entry ce; le_domxmlnodep = zend_register_list_destructors_ex(php_free_xml_node, NULL, "domnode", module_number); le_domxmlcommentp = zend_register_list_destructors_ex(php_free_xml_node, NULL, "domcomment", module_number); le_domxmltextp = zend_register_list_destructors_ex(php_free_xml_node, NULL, "domtext", module_number); le_domxmlattrp = zend_register_list_destructors_ex(php_free_xml_attr, NULL, "domattribute", module_number); le_domxmlelementp = zend_register_list_destructors_ex(php_free_xml_node, NULL, "domelement", module_number); le_domxmldtdp = zend_register_list_destructors_ex(php_free_xml_node, NULL, "domdtd", module_number); le_domxmlcdatap = zend_register_list_destructors_ex(php_free_xml_node, NULL, "domcdata", module_number); le_domxmlentityrefp = zend_register_list_destructors_ex(php_free_xml_node, NULL, "domentityref", module_number); le_domxmlpip = zend_register_list_destructors_ex(php_free_xml_node, NULL, "dompi", module_number); le_domxmlparserp = zend_register_list_destructors_ex(php_free_xml_parser, NULL, "domparser", module_number); le_domxmldoctypep = zend_register_list_destructors_ex(php_free_xml_node, NULL, "domdocumenttype", module_number); le_domxmlnamespacep = zend_register_list_destructors_ex(php_free_xml_node, NULL, "domnamespacenode", module_number); le_domxmldocp = zend_register_list_destructors_ex(php_free_xml_doc, NULL, "domdocument", module_number); /* Freeing the document contains freeing the complete tree. Therefore nodes, attributes etc. may not be freed seperately. Moved to end of list to support loading via dl() */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -