📄 xmlschemas.c
字号:
xmlSchemaTypePtr typeDef; /* the complex/simple type definition if any */ int flags; /* combination of node info flags */ int valNeeded; int normVal; xmlSchemaElementPtr decl; /* the element/attribute declaration */ int depth; xmlSchemaPSVIIDCBindingPtr idcTable; /* the table of PSVI IDC bindings for the scope element*/ xmlSchemaIDCMatcherPtr idcMatchers; /* the IDC matchers for the scope element */ xmlRegExecCtxtPtr regexCtxt; const xmlChar **nsBindings; /* Namespace bindings on this element */ int nbNsBindings; int sizeNsBindings; int hasKeyrefs; int appliedXPath; /* Indicates that an XPath has been applied. */};#define XML_SCHEMAS_ATTR_UNKNOWN 1#define XML_SCHEMAS_ATTR_ASSESSED 2#define XML_SCHEMAS_ATTR_PROHIBITED 3#define XML_SCHEMAS_ATTR_ERR_MISSING 4#define XML_SCHEMAS_ATTR_INVALID_VALUE 5#define XML_SCHEMAS_ATTR_ERR_NO_TYPE 6#define XML_SCHEMAS_ATTR_ERR_FIXED_VALUE 7#define XML_SCHEMAS_ATTR_DEFAULT 8#define XML_SCHEMAS_ATTR_VALIDATE_VALUE 9#define XML_SCHEMAS_ATTR_ERR_WILD_STRICT_NO_DECL 10#define XML_SCHEMAS_ATTR_HAS_ATTR_USE 11#define XML_SCHEMAS_ATTR_HAS_ATTR_DECL 12#define XML_SCHEMAS_ATTR_WILD_SKIP 13#define XML_SCHEMAS_ATTR_WILD_LAX_NO_DECL 14#define XML_SCHEMAS_ATTR_ERR_WILD_DUPLICATE_ID 15#define XML_SCHEMAS_ATTR_ERR_WILD_AND_USE_ID 16#define XML_SCHEMAS_ATTR_META 17/** @metaType values of xmlSchemaAttrInfo.*/#define XML_SCHEMA_ATTR_INFO_META_XSI_TYPE 1#define XML_SCHEMA_ATTR_INFO_META_XSI_NIL 2#define XML_SCHEMA_ATTR_INFO_META_XSI_SCHEMA_LOC 3#define XML_SCHEMA_ATTR_INFO_META_XSI_NO_NS_SCHEMA_LOC 4#define XML_SCHEMA_ATTR_INFO_META_XMLNS 5typedef struct _xmlSchemaAttrInfo xmlSchemaAttrInfo;typedef xmlSchemaAttrInfo *xmlSchemaAttrInfoPtr;struct _xmlSchemaAttrInfo { int nodeType; xmlNodePtr node; int nodeLine; const xmlChar *localName; const xmlChar *nsName; const xmlChar *value; xmlSchemaValPtr val; /* the pre-computed value if any */ xmlSchemaTypePtr typeDef; /* the complex/simple type definition if any */ int flags; /* combination of node info flags */ xmlSchemaAttributePtr decl; /* the attribute declaration */ xmlSchemaAttributeUsePtr use; /* the attribute use */ int state; int metaType; const xmlChar *vcValue; /* the value constraint value */ xmlSchemaNodeInfoPtr parent;};#define XML_SCHEMA_VALID_CTXT_FLAG_STREAM 1/** * xmlSchemaValidCtxt: * * A Schemas validation context */struct _xmlSchemaValidCtxt { int type; void *errCtxt; /* user specific data block */ xmlSchemaValidityErrorFunc error; /* the callback in case of errors */ xmlSchemaValidityWarningFunc warning; /* the callback in case of warning */ xmlStructuredErrorFunc serror; xmlSchemaPtr schema; /* The schema in use */ xmlDocPtr doc; xmlParserInputBufferPtr input; xmlCharEncoding enc; xmlSAXHandlerPtr sax; xmlParserCtxtPtr parserCtxt; void *user_data; /* TODO: What is this for? */ int err; int nberrors; xmlNodePtr node; xmlNodePtr cur; /* xmlSchemaTypePtr type; */ xmlRegExecCtxtPtr regexp; xmlSchemaValPtr value; int valueWS; int options; xmlNodePtr validationRoot; xmlSchemaParserCtxtPtr pctxt; int xsiAssemble; int depth; xmlSchemaNodeInfoPtr *elemInfos; /* array of element informations */ int sizeElemInfos; xmlSchemaNodeInfoPtr inode; /* the current element information */ xmlSchemaIDCAugPtr aidcs; /* a list of augmented IDC informations */ xmlSchemaIDCStateObjPtr xpathStates; /* first active state object. */ xmlSchemaIDCStateObjPtr xpathStatePool; /* first stored state object. */ xmlSchemaIDCMatcherPtr idcMatcherCache; /* Cache for IDC matcher objects. */ xmlSchemaPSVIIDCNodePtr *idcNodes; /* list of all IDC node-table entries*/ int nbIdcNodes; int sizeIdcNodes; xmlSchemaPSVIIDCKeyPtr *idcKeys; /* list of all IDC node-table entries */ int nbIdcKeys; int sizeIdcKeys; int flags; xmlDictPtr dict;#ifdef LIBXML_READER_ENABLED xmlTextReaderPtr reader;#endif xmlSchemaAttrInfoPtr *attrInfos; int nbAttrInfos; int sizeAttrInfos; int skipDepth; xmlSchemaItemListPtr nodeQNames; int hasKeyrefs; int createIDCNodeTables; int psviExposeIDCNodeTables;};/** * xmlSchemaSubstGroup: * * */typedef struct _xmlSchemaSubstGroup xmlSchemaSubstGroup;typedef xmlSchemaSubstGroup *xmlSchemaSubstGroupPtr;struct _xmlSchemaSubstGroup { xmlSchemaElementPtr head; xmlSchemaItemListPtr members;};/************************************************************************ * * * Some predeclarations * * * ************************************************************************/static int xmlSchemaParseInclude(xmlSchemaParserCtxtPtr ctxt, xmlSchemaPtr schema, xmlNodePtr node);static int xmlSchemaParseRedefine(xmlSchemaParserCtxtPtr ctxt, xmlSchemaPtr schema, xmlNodePtr node);static intxmlSchemaTypeFixup(xmlSchemaTypePtr type, xmlSchemaAbstractCtxtPtr ctxt);static const xmlChar *xmlSchemaFacetTypeToString(xmlSchemaTypeType type);static intxmlSchemaParseImport(xmlSchemaParserCtxtPtr ctxt, xmlSchemaPtr schema, xmlNodePtr node);static intxmlSchemaCheckFacetValues(xmlSchemaTypePtr typeDecl, xmlSchemaParserCtxtPtr ctxt);static voidxmlSchemaClearValidCtxt(xmlSchemaValidCtxtPtr vctxt);static xmlSchemaWhitespaceValueTypexmlSchemaGetWhiteSpaceFacetValue(xmlSchemaTypePtr type);static xmlSchemaTreeItemPtrxmlSchemaParseModelGroup(xmlSchemaParserCtxtPtr ctxt, xmlSchemaPtr schema, xmlNodePtr node, xmlSchemaTypeType type, int withParticle);static const xmlChar *xmlSchemaGetComponentTypeStr(xmlSchemaBasicItemPtr item);static xmlSchemaTypeLinkPtrxmlSchemaGetUnionSimpleTypeMemberTypes(xmlSchemaTypePtr type);static voidxmlSchemaInternalErr(xmlSchemaAbstractCtxtPtr actxt, const char *funcName, const char *message);static intxmlSchemaCheckCOSSTDerivedOK(xmlSchemaAbstractCtxtPtr ctxt, xmlSchemaTypePtr type, xmlSchemaTypePtr baseType, int subset);static voidxmlSchemaCheckElementDeclComponent(xmlSchemaElementPtr elemDecl, xmlSchemaParserCtxtPtr ctxt);static voidxmlSchemaComponentListFree(xmlSchemaItemListPtr list);static xmlSchemaQNameRefPtrxmlSchemaParseAttributeGroupRef(xmlSchemaParserCtxtPtr pctxt, xmlSchemaPtr schema, xmlNodePtr node);/************************************************************************ * * * Helper functions * * * ************************************************************************//** * xmlSchemaItemTypeToStr: * @type: the type of the schema item * * Returns the component name of a schema item. */static const xmlChar *xmlSchemaItemTypeToStr(xmlSchemaTypeType type){ switch (type) { case XML_SCHEMA_TYPE_BASIC: return(BAD_CAST "simple type definition"); case XML_SCHEMA_TYPE_SIMPLE: return(BAD_CAST "simple type definition"); case XML_SCHEMA_TYPE_COMPLEX: return(BAD_CAST "complex type definition"); case XML_SCHEMA_TYPE_ELEMENT: return(BAD_CAST "element declaration"); case XML_SCHEMA_TYPE_ATTRIBUTE_USE: return(BAD_CAST "attribute use"); case XML_SCHEMA_TYPE_ATTRIBUTE: return(BAD_CAST "attribute declaration"); case XML_SCHEMA_TYPE_GROUP: return(BAD_CAST "model group definition"); case XML_SCHEMA_TYPE_ATTRIBUTEGROUP: return(BAD_CAST "attribute group definition"); case XML_SCHEMA_TYPE_NOTATION: return(BAD_CAST "notation declaration"); case XML_SCHEMA_TYPE_SEQUENCE: return(BAD_CAST "model group (sequence)"); case XML_SCHEMA_TYPE_CHOICE: return(BAD_CAST "model group (choice)"); case XML_SCHEMA_TYPE_ALL: return(BAD_CAST "model group (all)"); case XML_SCHEMA_TYPE_PARTICLE: return(BAD_CAST "particle"); case XML_SCHEMA_TYPE_IDC_UNIQUE: return(BAD_CAST "unique identity-constraint"); /* return(BAD_CAST "IDC (unique)"); */ case XML_SCHEMA_TYPE_IDC_KEY: return(BAD_CAST "key identity-constraint"); /* return(BAD_CAST "IDC (key)"); */ case XML_SCHEMA_TYPE_IDC_KEYREF: return(BAD_CAST "keyref identity-constraint"); /* return(BAD_CAST "IDC (keyref)"); */ case XML_SCHEMA_TYPE_ANY: return(BAD_CAST "wildcard (any)"); case XML_SCHEMA_EXTRA_QNAMEREF: return(BAD_CAST "[helper component] QName reference"); case XML_SCHEMA_EXTRA_ATTR_USE_PROHIB: return(BAD_CAST "[helper component] attribute use prohibition"); default: return(BAD_CAST "Not a schema component"); }}/** * xmlSchemaGetComponentTypeStr: * @type: the type of the schema item * * Returns the component name of a schema item. */static const xmlChar *xmlSchemaGetComponentTypeStr(xmlSchemaBasicItemPtr item){ switch (item->type) { case XML_SCHEMA_TYPE_BASIC: if (WXS_IS_COMPLEX(WXS_TYPE_CAST item)) return(BAD_CAST "complex type definition"); else return(BAD_CAST "simple type definition"); default: return(xmlSchemaItemTypeToStr(item->type)); }}/** * xmlSchemaGetComponentNode: * @item: a schema component * * Returns node associated with the schema component. * NOTE that such a node need not be available; plus, a component's * node need not to reflect the component directly, since there is no * one-to-one relationship between the XML Schema representation and * the component representation. */static xmlNodePtrxmlSchemaGetComponentNode(xmlSchemaBasicItemPtr item){ switch (item->type) { case XML_SCHEMA_TYPE_ELEMENT: return (((xmlSchemaElementPtr) item)->node); case XML_SCHEMA_TYPE_ATTRIBUTE: return (((xmlSchemaAttributePtr) item)->node); case XML_SCHEMA_TYPE_COMPLEX: case XML_SCHEMA_TYPE_SIMPLE: return (((xmlSchemaTypePtr) item)->node); case XML_SCHEMA_TYPE_ANY: case XML_SCHEMA_TYPE_ANY_ATTRIBUTE: return (((xmlSchemaWildcardPtr) item)->node); case XML_SCHEMA_TYPE_PARTICLE: return (((xmlSchemaParticlePtr) item)->node); case XML_SCHEMA_TYPE_SEQUENCE: case XML_SCHEMA_TYPE_CHOICE: case XML_SCHEMA_TYPE_ALL: return (((xmlSchemaModelGroupPtr) item)->node); case XML_SCHEMA_TYPE_GROUP: return (((xmlSchemaModelGroupDefPtr) item)->node); case XML_SCHEMA_TYPE_ATTRIBUTEGROUP: return (((xmlSchemaAttributeGroupPtr) item)->node); case XML_SCHEMA_TYPE_IDC_UNIQUE: case XML_SCHEMA_TYPE_IDC_KEY: case XML_SCHEMA_TYPE_IDC_KEYREF: return (((xmlSchemaIDCPtr) item)->node); case XML_SCHEMA_EXTRA_QNAMEREF: return(((xmlSchemaQNameRefPtr) item)->node); /* TODO: What to do with NOTATIONs? case XML_SCHEMA_TYPE_NOTATION: return (((xmlSchemaNotationPtr) item)->node); */ case XML_SCHEMA_TYPE_ATTRIBUTE_USE: return (((xmlSchemaAttributeUsePtr) item)->node); default: return (NULL); }}#if 0/** * xmlSchemaGetNextComponent: * @item: a schema component * * Returns the next sibling of the schema component. */static xmlSchemaBasicItemPtrxmlSchemaGetNextComponent(xmlSchemaBasicItemPtr item){ switch (item->type) { case XML_SCHEMA_TYPE_ELEMENT: return ((xmlSchemaBasicItemPtr) ((xmlSchemaElementPtr) item)->next); case XML_SCHEMA_TYPE_ATTRIBUTE: return ((xmlSchemaBasicItemPtr) ((xmlSchemaAttributePtr) item)->next); case XML_SCHEMA_TYPE_COMPLEX: case XML_SCHEMA_TYPE_SIMPLE: return ((xmlSchemaBasicItemPtr) ((xmlSchemaTypePtr) item)->next); case XML_SCHEMA_TYPE_ANY: case XML_SCHEMA_TYPE_ANY_ATTRIBUTE: return (NULL); case XML_SCHEMA_TYPE_PARTICLE: return ((xmlSchemaBasicItemPtr) ((xmlSchemaParticlePtr) item)->next); case XML_SCHEMA_TYPE_SEQUENCE: case XML_SCHEMA_TYPE_CHOICE: case XML_SCHEMA_TYPE_ALL: return (NULL); case XML_SCHEMA_TYPE_GROUP: return (NULL); case XML_SCHEMA_TYPE_ATTRIBUTEGROUP: return ((xmlSchemaBasicItemPtr) ((xmlSchemaAttributeGroupPtr) item)->next); case XML_SCHEMA_TYPE_IDC_UNIQUE: case XML_SCHEMA_TYPE_IDC_KEY: case XML_SCHEMA_TYPE_IDC_KEYREF: return ((xmlSchemaBasicItemPtr) ((xmlSchemaIDCPtr) item)->next); default: return (NULL); }}#endif/** * xmlSchemaFormatQName: * @buf: the string buffer * @namespaceName: the namespace name * @localName: the local name * * Returns the given QName in the format "{namespaceName}localName" or * just "localName" if @namespaceName is NULL. * * Returns the localName if @namespaceName is NULL, a formatted * string otherwise. */static const xmlChar*xmlSchemaFormatQName(xmlChar **buf, const xmlChar *namespaceName, const xmlChar *localName){ FREE_AND_NULL(*buf) if (namespaceName != NULL) { *buf = xmlStrdup(BAD_CAST "{"); *buf = xmlStrcat(*buf, namespaceName); *buf = xmlStrcat(*buf, BAD_CAST "}"); } if (localName != NULL) { if (namespaceName == NULL) return(localName); *buf = xmlStrcat(*buf, localName); } else { *buf = xmlStrcat(*buf, BAD_CAST "(NULL)"); } return ((const xmlChar *) *buf);}static const xmlChar* xmlSchemaFormatQNameNs(xmlChar **buf, xmlNsPtr ns, const xmlChar *localName){ if (ns != NULL) return (xmlSchemaFormatQName(buf, ns->href, localName)); else return (xmlSchemaFormatQName(buf, NULL, localName));}static const xmlChar *xmlSchemaGetComponentName(xmlSchemaBasicItemPtr item){ switch (item->type) { case XML_SCHEMA_TYPE_ELEMENT: return (((xmlSchemaElementPtr) item)->name); case XML_SCHEMA_TYPE_ATTRIBUTE: return (((xmlSchemaAttributePtr) item)->name); case XML_SCHEMA_TYPE_ATTRIBUTEGROUP: return (((xmlSchemaAttributeGroupPtr) item)->name); case XML_SCHEMA_TYPE_BASIC: case XML_SCHEMA_TYPE_SIMPLE: case XML_SCHEMA_TYPE_COMPLEX: return (((xmlSchemaTypePtr) item)->name);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -