mirror of
https://github.com/php/php-src.git
synced 2024-09-22 02:17:32 +00:00
Added DomDocument->recover property for parsing not well-formed XML Documents.
This commit is contained in:
parent
566230a01b
commit
e99c375606
2
NEWS
2
NEWS
@ -24,6 +24,8 @@ PHP NEWS
|
||||
. mysqli->client_info property (Georg)
|
||||
. inet_pton() (Sara)
|
||||
. inet_ntop() (Sara)
|
||||
- Added DomDocument->recover property for parsing not well-formed
|
||||
XML Documents. (Christian)
|
||||
- Added Cursor support for MySQL 5.0.x in mysqli (Georg)
|
||||
- Added proxy support to ftp wrapper via http. (Sara)
|
||||
- Added MDTM support to ftp_url_stat. (Sara)
|
||||
|
@ -614,6 +614,48 @@ int dom_document_preserve_whitespace_write(dom_object *obj, zval *newval TSRMLS_
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
/* {{{ proto recover boolean
|
||||
readonly=no
|
||||
*/
|
||||
int dom_document_recover_read(dom_object *obj, zval **retval TSRMLS_DC)
|
||||
{
|
||||
dom_doc_props *doc_prop;
|
||||
|
||||
ALLOC_ZVAL(*retval);
|
||||
if (obj->document) {
|
||||
doc_prop = dom_get_doc_props(obj->document);
|
||||
ZVAL_BOOL(*retval, doc_prop->recover);
|
||||
} else {
|
||||
ZVAL_FALSE(*retval);
|
||||
}
|
||||
return SUCCESS;
|
||||
}
|
||||
|
||||
int dom_document_recover_write(dom_object *obj, zval *newval TSRMLS_DC)
|
||||
{
|
||||
zval value_copy;
|
||||
dom_doc_props *doc_prop;
|
||||
|
||||
if(newval->refcount > 1) {
|
||||
value_copy = *newval;
|
||||
zval_copy_ctor(&value_copy);
|
||||
newval = &value_copy;
|
||||
}
|
||||
convert_to_boolean(newval);
|
||||
|
||||
if (obj->document) {
|
||||
doc_prop = dom_get_doc_props(obj->document);
|
||||
doc_prop->recover = Z_LVAL_P(newval);
|
||||
}
|
||||
|
||||
if (newval == &value_copy) {
|
||||
zval_dtor(newval);
|
||||
}
|
||||
|
||||
return SUCCESS;
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
|
||||
/* {{{ proto substituteEntities boolean
|
||||
readonly=no
|
||||
@ -1392,7 +1434,7 @@ static xmlDocPtr dom_document_parser(zval *id, int mode, char *source TSRMLS_DC)
|
||||
dom_doc_props *doc_props;
|
||||
dom_object *intern;
|
||||
php_libxml_ref_obj *document = NULL;
|
||||
int validate, resolve_externals, keep_blanks, substitute_ent;
|
||||
int validate, recover, resolve_externals, keep_blanks, substitute_ent;
|
||||
int resolved_path_len;
|
||||
char *directory=NULL, resolved_path[MAXPATHLEN];
|
||||
|
||||
@ -1406,6 +1448,7 @@ static xmlDocPtr dom_document_parser(zval *id, int mode, char *source TSRMLS_DC)
|
||||
resolve_externals = doc_props->resolveexternals;
|
||||
keep_blanks = doc_props->preservewhitespace;
|
||||
substitute_ent = doc_props->substituteentities;
|
||||
recover = doc_props->recover;
|
||||
|
||||
if (document == NULL) {
|
||||
efree(doc_props);
|
||||
@ -1455,7 +1498,7 @@ static xmlDocPtr dom_document_parser(zval *id, int mode, char *source TSRMLS_DC)
|
||||
}
|
||||
}
|
||||
|
||||
ctxt->recovery = 0;
|
||||
ctxt->recovery = recover;
|
||||
ctxt->validate = validate;
|
||||
ctxt->loadsubset = (resolve_externals * XML_COMPLETE_ATTRS);
|
||||
ctxt->replaceEntities = substitute_ent;
|
||||
@ -1470,7 +1513,7 @@ static xmlDocPtr dom_document_parser(zval *id, int mode, char *source TSRMLS_DC)
|
||||
|
||||
xmlParseDocument(ctxt);
|
||||
|
||||
if (ctxt->wellFormed) {
|
||||
if (ctxt->wellFormed || recover) {
|
||||
ret = ctxt->myDoc;
|
||||
/* If loading from memory, set the base reference uri for the document */
|
||||
if (ret->URL == NULL && ctxt->directory != NULL) {
|
||||
|
@ -59,6 +59,8 @@ int dom_document_resolve_externals_read(dom_object *obj, zval **retval TSRMLS_DC
|
||||
int dom_document_resolve_externals_write(dom_object *obj, zval *newval TSRMLS_DC);
|
||||
int dom_document_preserve_whitespace_read(dom_object *obj, zval **retval TSRMLS_DC);
|
||||
int dom_document_preserve_whitespace_write(dom_object *obj, zval *newval TSRMLS_DC);
|
||||
int dom_document_recover_read(dom_object *obj, zval **retval TSRMLS_DC);
|
||||
int dom_document_recover_write(dom_object *obj, zval *newval TSRMLS_DC);
|
||||
int dom_document_substitue_entities_read(dom_object *obj, zval **retval TSRMLS_DC);
|
||||
int dom_document_substitue_entities_write(dom_object *obj, zval *newval TSRMLS_DC);
|
||||
|
||||
|
@ -126,6 +126,7 @@ dom_doc_propsptr dom_get_doc_props(php_libxml_ref_obj *document)
|
||||
doc_props->preservewhitespace = 1;
|
||||
doc_props->substituteentities = 0;
|
||||
doc_props->stricterror = 1;
|
||||
doc_props->recover = 0;
|
||||
if (document) {
|
||||
document->doc_props = doc_props;
|
||||
}
|
||||
@ -462,6 +463,7 @@ PHP_MINIT_FUNCTION(dom)
|
||||
dom_register_prop_handler(&dom_document_prop_handlers, "validateOnParse", dom_document_validate_on_parse_read, dom_document_validate_on_parse_write TSRMLS_CC);
|
||||
dom_register_prop_handler(&dom_document_prop_handlers, "resolveExternals", dom_document_resolve_externals_read, dom_document_resolve_externals_write TSRMLS_CC);
|
||||
dom_register_prop_handler(&dom_document_prop_handlers, "preserveWhiteSpace", dom_document_preserve_whitespace_read, dom_document_preserve_whitespace_write TSRMLS_CC);
|
||||
dom_register_prop_handler(&dom_document_prop_handlers, "recover", dom_document_recover_read, dom_document_recover_write TSRMLS_CC);
|
||||
dom_register_prop_handler(&dom_document_prop_handlers, "substituteEntities", dom_document_substitue_entities_read, dom_document_substitue_entities_write TSRMLS_CC);
|
||||
|
||||
zend_hash_merge(&dom_document_prop_handlers, &dom_node_prop_handlers, NULL, NULL, sizeof(dom_prop_handler), 0);
|
||||
|
@ -31,6 +31,7 @@ typedef struct _dom_doc_props {
|
||||
int preservewhitespace;
|
||||
int substituteentities;
|
||||
int stricterror;
|
||||
int recover;
|
||||
} dom_doc_props;
|
||||
|
||||
typedef dom_doc_props *dom_doc_propsptr;
|
||||
|
Loading…
Reference in New Issue
Block a user