X-Git-Url: http://mj.ucw.cz/gitweb/?a=blobdiff_plain;ds=inline;f=sherlock%2Fxml%2Fparse.c;h=6f5b192f0ab29e021f4e8e219e6bf6c5d9544cbb;hb=306801fc6da02fcbed53db6ff98cd0277b763d9a;hp=2003d091091b51eef42bbd5207b05405577baca8;hpb=ccd6cdc3fe59f222ed3c4515fa9c4065479f6d9d;p=libucw.git diff --git a/sherlock/xml/parse.c b/sherlock/xml/parse.c index 2003d091..6f5b192f 100644 --- a/sherlock/xml/parse.c +++ b/sherlock/xml/parse.c @@ -680,6 +680,18 @@ xml_attrs_table_cleanup(struct xml_context *ctx) /*** Elements ***/ +static uns +xml_validate_element(struct xml_dtd_elem_node *root, struct xml_dtd_elem *elem) +{ + if (root->elem) + return elem == root->elem; + else + SLIST_FOR_EACH(struct xml_dtd_elem_node *, son, root->sons) + if (xml_validate_element(son, elem)) + return 1; + return 0; +} + static void xml_push_element(struct xml_context *ctx) { @@ -705,12 +717,20 @@ xml_push_element(struct xml_context *ctx) xml_error(ctx, "Undefined element <%s>", e->name); else { - if (e->dtd->type == XML_DTD_ELEM_MIXED) + struct xml_dtd_elem *dtd = e->dtd, *parent_dtd = e->parent ? e->parent->dtd : NULL; + if (dtd->type == XML_DTD_ELEM_MIXED) ctx->flags &= ~XML_NO_CHARS; else ctx->flags |= XML_NO_CHARS; - - // FIXME: validate regular expressions + if (parent_dtd) + if (parent_dtd->type == XML_DTD_ELEM_EMPTY) + xml_error(ctx, "Empty element must not contain children"); + else if (parent_dtd->type != XML_DTD_ELEM_ANY) + { + // FIXME: validate regular expressions + if (!xml_validate_element(parent_dtd->node, dtd)) + xml_error(ctx, "Unexpected element <%s>", e->name); + } } while (1) {