1
0
mirror of https://gitlab.gnome.org/GNOME/libxml2.git synced 2025-07-28 00:21:53 +03:00

okay the DTD validation code on top of the XMLTextParser API should be

* xmlreader.c python/tests/reader2py: okay the DTD validation
  code on top of the XMLTextParser API should be solid now.
Daniel
This commit is contained in:
Daniel Veillard
2003-01-03 12:52:08 +00:00
parent 1fdfd115e5
commit a80ff6ec18
3 changed files with 129 additions and 10 deletions

View File

@ -1,3 +1,8 @@
Fri Jan 3 13:50:55 CET 2003 Daniel Veillard <daniel@veillard.com>
* xmlreader.c python/tests/reader2py: okay the DTD validation
code on top of the XMLTextParser API should be solid now.
Fri Jan 3 02:17:18 CET 2003 Daniel Veillard <daniel@veillard.com> Fri Jan 3 02:17:18 CET 2003 Daniel Veillard <daniel@veillard.com>
* xmlreader.c python/tests/reader2py: Fixing some more mess * xmlreader.c python/tests/reader2py: Fixing some more mess

View File

@ -197,6 +197,45 @@ if err != "":
print err print err
sys.exit(1) sys.exit(1)
#
# The same test but without entity substitution this time
#
s = """<!DOCTYPE test [
<!ELEMENT test (x, x)>
<!ELEMENT x (y)>
<!ELEMENT y (#PCDATA)>
<!ENTITY x "<x>&y;</x>">
<!ENTITY y "<y>yyy</y>">
]>
<test>
&x;
&x;
</test>"""
expect="""1 test 0
3 #text 1
5 x 1
3 #text 1
5 x 1
3 #text 1
15 test 0
"""
res=""
err=""
input = libxml2.inputBuffer(StringIO.StringIO(s))
reader = input.newTextReader("test4")
reader.SetParserProp(libxml2.PARSER_VALIDATE,1)
while reader.Read() == 1:
res = res + "%s %s %d\n" % (reader.NodeType(),reader.Name(),reader.Depth())
if res != expect:
print "test5 failed: unexpected output"
print res
if err != "":
print "test5 failed: validation error found"
print err
# #
# cleanup # cleanup
# #

View File

@ -243,21 +243,12 @@ xmlTextReaderEndElement(void *ctx, const xmlChar *fullname) {
printf("xmlTextReaderEndElement(%s)\n", fullname); printf("xmlTextReaderEndElement(%s)\n", fullname);
#endif #endif
if ((reader != NULL) && (reader->endElement != NULL)) { if ((reader != NULL) && (reader->endElement != NULL)) {
xmlNodePtr node = ctxt->node;
/* /*
* when processing an entity, the context may have been changed * when processing an entity, the context may have been changed
*/ */
origctxt = reader->ctxt; origctxt = reader->ctxt;
reader->endElement(ctx, fullname); reader->endElement(ctx, fullname);
#if 0
123
if (origctxt->validate) {
ctxt->valid &= xmlValidatePopElement(&origctxt->vctxt,
ctxt->myDoc, node, fullname);
}
#endif
} }
if (reader != NULL) { if (reader != NULL) {
if (reader->state == XML_TEXTREADER_ELEMENT) if (reader->state == XML_TEXTREADER_ELEMENT)
@ -472,6 +463,86 @@ xmlTextReaderValidatePop(xmlTextReaderPtr reader) {
xmlFree(qname); xmlFree(qname);
} }
} }
/**
* xmlTextReaderValidateEntity:
* @reader: the xmlTextReaderPtr used
*
* Handle the validation when an entity reference is encountered and
* entity substitution is not activated. As a result the parser interface
* must walk through the entity and do the validation calls
*/
static void
xmlTextReaderValidateEntity(xmlTextReaderPtr reader) {
xmlNodePtr oldnode = reader->node;
xmlNodePtr node = reader->node;
xmlParserCtxtPtr ctxt = reader->ctxt;
do {
if (node->type == XML_ENTITY_REF_NODE) {
/*
* Case where the underlying tree is not availble, lookup the entity
* and walk it.
*/
if ((node->children == NULL) && (ctxt->sax != NULL) &&
(ctxt->sax->getEntity != NULL)) {
node->children = (xmlNodePtr)
ctxt->sax->getEntity(ctxt, node->name);
}
if ((node->children != NULL) &&
(node->children->type == XML_ENTITY_DECL) &&
(node->children->children != NULL)) {
xmlTextReaderEntPush(reader, node);
node = node->children->children;
continue;
} else {
/*
* The error has probably be raised already.
*/
if (node == oldnode)
break;
node = node->next;
}
} else if (node->type == XML_ELEMENT_NODE) {
reader->node = node;
xmlTextReaderValidatePush(reader);
} else if ((node->type == XML_TEXT_NODE) ||
(node->type == XML_CDATA_SECTION_NODE)) {
ctxt->valid &= xmlValidatePushCData(&ctxt->vctxt,
node->content, xmlStrlen(node->content));
}
/*
* go to next node
*/
if (node->children != NULL) {
node = node->children;
continue;
}
if (node->next != NULL) {
node = node->next;
continue;
}
do {
node = node->parent;
if (node->type == XML_ELEMENT_NODE) {
reader->node = node;
xmlTextReaderValidatePop(reader);
}
if ((node->type == XML_ENTITY_DECL) &&
(reader->ent != NULL) && (reader->ent->children == node)) {
node = xmlTextReaderEntPop(reader);
}
if (node == oldnode)
break;
if (node->next != NULL) {
node = node->next;
break;
}
} while ((node != NULL) && (node != oldnode));
} while ((node != NULL) && (node != oldnode));
reader->node = oldnode;
}
/** /**
@ -633,7 +704,7 @@ node_found:
DUMP_READER DUMP_READER
/* /*
* Handle entities enter and exit * Handle entities enter and exit when in entity replacement mode
*/ */
if ((reader->node != NULL) && if ((reader->node != NULL) &&
(reader->node->type == XML_ENTITY_REF_NODE) && (reader->node->type == XML_ENTITY_REF_NODE) &&
@ -654,6 +725,10 @@ node_found:
xmlTextReaderEntPush(reader, reader->node); xmlTextReaderEntPush(reader, reader->node);
reader->node = reader->node->children->children; reader->node = reader->node->children->children;
} }
} else if ((reader->node != NULL) &&
(reader->node->type == XML_ENTITY_REF_NODE) &&
(reader->ctxt != NULL) && (reader->ctxt->validate == 1)) {
xmlTextReaderValidateEntity(reader);
} }
if ((reader->node != NULL) && if ((reader->node != NULL) &&
(reader->node->type == XML_ENTITY_DECL) && (reader->node->type == XML_ENTITY_DECL) &&