220 lines
4.4 KiB
C++
220 lines
4.4 KiB
C++
//
|
|
// XSDElement.h
|
|
//
|
|
// Copyright (c) Microsoft Corporation. All rights reserved.
|
|
//
|
|
|
|
#pragma once
|
|
|
|
#include "stdafx.h"
|
|
#include "XMLElement.h"
|
|
#include "XSDMappingTable.h"
|
|
#include "Emit.h"
|
|
|
|
enum XSDELEMENT_TYPE
|
|
{
|
|
XSD_UNK = 0,
|
|
|
|
XSD_ERR = 1,
|
|
|
|
//
|
|
// Permits the elements in the group to appear (or not appear)
|
|
// in any order in the containing element.
|
|
//
|
|
XSD_ALL = 2,
|
|
|
|
//
|
|
// Enables any element from the specified namespace(s)
|
|
// to appear in the containing complexType, sequence, or choice element.
|
|
//
|
|
XSD_ANY,
|
|
|
|
//
|
|
// Enables any attribute from the specified namespace(s)
|
|
// to appear in the containing complexType element.
|
|
//
|
|
XSD_ANYATTRIBUTE,
|
|
|
|
//
|
|
// Defines an annotation.
|
|
//
|
|
XSD_ANNOTATION,
|
|
|
|
//
|
|
// Specifies information to be used by applications
|
|
// within an annotation.
|
|
//
|
|
XSD_APPINFO,
|
|
|
|
//
|
|
// Declares an attribute.
|
|
//
|
|
XSD_ATTRIBUTE,
|
|
|
|
//
|
|
// Groups a set of attribute declarations so that they
|
|
// can be incorporated as a group into complex type definitions.
|
|
//
|
|
XSD_ATTRIBUTEGROUP,
|
|
|
|
//
|
|
// Permits one and only one of the elements contained in the group
|
|
// to be present within the containing element.
|
|
//
|
|
XSD_CHOICE,
|
|
|
|
//
|
|
// Defines a complex type, which determines the set of attributes
|
|
// and the content of an element.
|
|
//
|
|
XSD_COMPLEXTYPE,
|
|
|
|
//
|
|
// Specifies information to be read by or used by humans
|
|
// within an annotation.
|
|
//
|
|
XSD_DOCUMENTATION,
|
|
|
|
//
|
|
// Declares an element.
|
|
//
|
|
XSD_ELEMENT,
|
|
|
|
//
|
|
// Specifies an XPATH expression that specifies value
|
|
// (or one of the values) used to enforce an identity
|
|
// constraint (unique, key, keyref).
|
|
//
|
|
XSD_FIELD,
|
|
|
|
//
|
|
// Groups a set of element declarations so that they can
|
|
// be incorporated as a group into complex type definitions.
|
|
//
|
|
XSD_GROUP,
|
|
|
|
//
|
|
// Identifies a namespace whose schema components are referenced
|
|
// by the containing schema.
|
|
//
|
|
XSD_IMPORT,
|
|
|
|
//
|
|
// Includes the specified schema document in the targetNamespace
|
|
// of the containing schema.
|
|
//
|
|
XSD_INCLUDE,
|
|
|
|
//
|
|
// Specifies that an attribute or element value (or set of values)
|
|
// must be a key within the specified scope. A key must be unique,
|
|
// non-nullable, and always present.
|
|
//
|
|
XSD_KEY,
|
|
|
|
//
|
|
// Specifies that an attribute or element value (or set of values)
|
|
// have a correspondence with those of the specified key or unique element.
|
|
//
|
|
XSD_KEYREF,
|
|
|
|
//
|
|
// Contains the definition of a schema.
|
|
//
|
|
XSD_SCHEMA,
|
|
|
|
//
|
|
// Specifies an XPATH expression that selects a set of elements for an
|
|
// identity constraint (unique, key, keyref).
|
|
//
|
|
XSD_SELECTOR,
|
|
|
|
//
|
|
// Requires the elements in the group to appear in the specified sequence
|
|
// within the containing element.
|
|
//
|
|
XSD_SEQUENCE,
|
|
|
|
//
|
|
// Defines a simple type, which determines the constraints on and
|
|
// information about the values of attributes or elements with
|
|
// text-only content.
|
|
//
|
|
XSD_SIMPLETYPE,
|
|
|
|
//
|
|
// Specifies that an attribute or element value (or set of values)
|
|
// must be unique within the specified scope.
|
|
//
|
|
XSD_UNIQUE,
|
|
|
|
XSD_COMPLEXCONTENT,
|
|
XSD_SIMPLECONTENT,
|
|
XSD_RESTRICTION,
|
|
XSD_EXTENSION,
|
|
|
|
XSD_UNSUPPORTED
|
|
};
|
|
|
|
class CSchema;
|
|
|
|
class CXSDElement : public CXMLElement
|
|
{
|
|
private:
|
|
|
|
XSDELEMENT_TYPE m_elementType;
|
|
CSchema * m_pParentSchema;
|
|
|
|
public:
|
|
|
|
CXSDElement(CXMLElement * pParentElement = NULL, XSDELEMENT_TYPE elementType = XSD_UNK)
|
|
:m_elementType(elementType)
|
|
{
|
|
SetParentElement(pParentElement);
|
|
}
|
|
|
|
inline XSDELEMENT_TYPE GetElementType()
|
|
{
|
|
return m_elementType;
|
|
}
|
|
|
|
inline void SetElementType(XSDELEMENT_TYPE elementType)
|
|
{
|
|
m_elementType = elementType;
|
|
}
|
|
|
|
inline CSchema * GetParentSchema()
|
|
{
|
|
return m_pParentSchema;
|
|
}
|
|
|
|
inline void SetParentSchema(CSchema * pParentSchema)
|
|
{
|
|
m_pParentSchema = pParentSchema;
|
|
}
|
|
};
|
|
|
|
// XSD Mapping table
|
|
extern const __declspec(selectany) CXSDTypeLookup g_xsdLookup;
|
|
|
|
inline HRESULT GetXSDType(const CStringW& strUri, const CStringW& strName, XSDTYPE *pXSD)
|
|
{
|
|
ATLASSERT( pXSD != NULL );
|
|
*pXSD = XSDTYPE_ERR;
|
|
if (strUri == XSD_NAMESPACEW)
|
|
{
|
|
const CXSDTypeLookup::HashNode *pNode = g_xsdLookup.Lookup(strName);
|
|
if (pNode != NULL)
|
|
{
|
|
*pXSD = pNode->data.xsdType;
|
|
return S_OK;
|
|
}
|
|
else // (pNode == NULL)
|
|
{
|
|
EmitError(IDS_SDL_UNRESOLVED_ELEM, strUri, strName);
|
|
return E_FAIL;
|
|
}
|
|
}
|
|
|
|
return S_FALSE;
|
|
} |