X-Git-Url: http://mj.ucw.cz/gitweb/?a=blobdiff_plain;ds=sidebyside;f=sherlock%2Fxml%2Fparse.c;h=6f5b192f0ab29e021f4e8e219e6bf6c5d9544cbb;hb=306801fc6da02fcbed53db6ff98cd0277b763d9a;hp=f771b304162bddc1d272115cd855eee60a675f12;hpb=b12f3033ac773b6b22d558bd8f4c7b3de53f2867;p=libucw.git diff --git a/sherlock/xml/parse.c b/sherlock/xml/parse.c index f771b304..6f5b192f 100644 --- a/sherlock/xml/parse.c +++ b/sherlock/xml/parse.c @@ -654,6 +654,18 @@ xml_attr_find(struct xml_context *ctx, struct xml_node *node, char *name) return xml_attrs_find(ctx->tab_attrs, node, name); } +char * +xml_attr_value(struct xml_context *ctx, struct xml_node *node, char *name) +{ + struct xml_attr *attr = xml_attrs_find(ctx->tab_attrs, node, name); + if (attr) + return attr->val; + if (!node->dtd) + return NULL; + struct xml_dtd_attr *dtd = xml_dtd_find_attr(ctx, node->dtd, name); + return dtd ? dtd->default_value : NULL; +} + void xml_attrs_table_init(struct xml_context *ctx) { @@ -668,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) { @@ -693,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) {