summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ext/dom/node.c28
-rw-r--r--ext/dom/php_dom.c1
2 files changed, 22 insertions, 7 deletions
diff --git a/ext/dom/node.c b/ext/dom/node.c
index e638ec003f..40ba5b3ab4 100644
--- a/ext/dom/node.c
+++ b/ext/dom/node.c
@@ -279,13 +279,20 @@ Since:
*/
int dom_node_child_nodes_read(dom_object *obj, zval **retval TSRMLS_DC)
{
+ xmlNode *nodep;
dom_object *intern;
- ALLOC_ZVAL(*retval);
- php_dom_create_interator(*retval, DOM_NODELIST TSRMLS_CC);
+ nodep = dom_object_get_node(obj);
- intern = (dom_object *)zend_objects_get_address(*retval TSRMLS_CC);
- dom_namednode_iter(obj, XML_ELEMENT_NODE, intern, NULL, NULL, NULL);
+ ALLOC_ZVAL(*retval);
+
+ if (dom_node_children_valid(nodep) == FAILURE) {
+ ZVAL_NULL(*retval);
+ } else {
+ php_dom_create_interator(*retval, DOM_NODELIST TSRMLS_CC);
+ intern = (dom_object *)zend_objects_get_address(*retval TSRMLS_CC);
+ dom_namednode_iter(obj, XML_ELEMENT_NODE, intern, NULL, NULL, NULL);
+ }
return SUCCESS;
}
@@ -427,13 +434,20 @@ Since:
*/
int dom_node_attributes_read(dom_object *obj, zval **retval TSRMLS_DC)
{
+ xmlNode *nodep;
dom_object *intern;
+ nodep = dom_object_get_node(obj);
+
ALLOC_ZVAL(*retval);
- php_dom_create_interator(*retval, DOM_NAMEDNODEMAP TSRMLS_CC);
- intern = (dom_object *)zend_objects_get_address(*retval TSRMLS_CC);
- dom_namednode_iter(obj, XML_ATTRIBUTE_NODE, intern, NULL, NULL, NULL);
+ if (nodep->type == XML_ELEMENT_NODE) {
+ php_dom_create_interator(*retval, DOM_NAMEDNODEMAP TSRMLS_CC);
+ intern = (dom_object *)zend_objects_get_address(*retval TSRMLS_CC);
+ dom_namednode_iter(obj, XML_ATTRIBUTE_NODE, intern, NULL, NULL, NULL);
+ } else {
+ ZVAL_NULL(*retval);
+ }
return SUCCESS;
}
diff --git a/ext/dom/php_dom.c b/ext/dom/php_dom.c
index 53982b3571..33f9986422 100644
--- a/ext/dom/php_dom.c
+++ b/ext/dom/php_dom.c
@@ -103,6 +103,7 @@ int dom_node_children_valid(xmlNodePtr node) {
case XML_COMMENT_NODE:
case XML_TEXT_NODE:
case XML_CDATA_SECTION_NODE:
+ case XML_NOTATION_NODE:
return FAILURE;
break;
default: