fixed "Internal: MIXED struct bad" when #CDATA elements validation occured
* valid.c: fixed "Internal: MIXED struct bad" when #CDATA elements
validation occured on content with element child
Daniel
diff --git a/valid.c b/valid.c
index 9a46d03..a0e9c0f 100644
--- a/valid.c
+++ b/valid.c
@@ -3737,8 +3737,10 @@
}
break;
case XML_TEXT_NODE:
+ case XML_CDATA_SECTION_NODE:
if (xmlIsBlankNode(cur))
break;
+ /* no break on purpose */
case XML_ELEMENT_NODE:
/*
* Allocate a new node and minimally fills in
@@ -3842,6 +3844,72 @@
}
/**
+ * xmlValidateCdataElement:
+ * @ctxt: the validation context
+ * @doc: a document instance
+ * @elem: an element instance
+ *
+ * Check that an element follows #CDATA
+ *
+ * returns 1 if valid or 0 otherwise
+ */
+static int
+xmlValidateOneCdataElement(xmlValidCtxtPtr ctxt, xmlDocPtr doc,
+ xmlNodePtr elem) {
+ int ret = 1;
+ xmlNodePtr cur, child;
+
+ if ((ctxt == NULL) || (doc == NULL) | (elem == NULL))
+ return(0);
+
+ child = elem->children;
+
+ cur = child;
+ while (cur != NULL) {
+ switch (cur->type) {
+ case XML_ENTITY_REF_NODE:
+ /*
+ * Push the current node to be able to roll back
+ * and process within the entity
+ */
+ if ((cur->children != NULL) &&
+ (cur->children->children != NULL)) {
+ nodeVPush(ctxt, cur);
+ cur = cur->children->children;
+ continue;
+ }
+ break;
+ case XML_COMMENT_NODE:
+ case XML_PI_NODE:
+ case XML_TEXT_NODE:
+ case XML_CDATA_SECTION_NODE:
+ break;
+ default:
+ ret = 0;
+ goto done;
+ }
+ /*
+ * Switch to next element
+ */
+ cur = cur->next;
+ while (cur == NULL) {
+ cur = nodeVPop(ctxt);
+ if (cur == NULL)
+ break;
+ cur = cur->next;
+ }
+ }
+done:
+ ctxt->nodeMax = 0;
+ ctxt->nodeNr = 0;
+ if (ctxt->nodeTab != NULL) {
+ xmlFree(ctxt->nodeTab);
+ ctxt->nodeTab = NULL;
+ }
+ return(ret);
+}
+
+/**
* xmlValidateOneElement:
* @ctxt: the validation context
* @doc: a document instance
@@ -3872,8 +3940,6 @@
CHECK_DTD;
if (elem == NULL) return(0);
- if (elem->type == XML_TEXT_NODE) {
- }
switch (elem->type) {
case XML_ATTRIBUTE_NODE:
VERROR(ctxt->userData,
@@ -3981,8 +4047,19 @@
/* I don't think anything is required then */
break;
case XML_ELEMENT_TYPE_MIXED:
- /* Hum, this start to get messy */
+ /* simple case of declared as #PCDATA */
+ if ((elemDecl->content != NULL) &&
+ (elemDecl->content->type == XML_ELEMENT_CONTENT_PCDATA)) {
+ ret = xmlValidateOneCdataElement(ctxt, doc, elem);
+ if (!ret) {
+ VERROR(ctxt->userData,
+ "Element %s was declared #PCDATA but contains non text nodes\n",
+ elem->name);
+ }
+ break;
+ }
child = elem->children;
+ /* Hum, this start to get messy */
while (child != NULL) {
if (child->type == XML_ELEMENT_NODE) {
name = child->name;