536cd135cc
Former-commit-id: 5624ac747d633e885131e8349322922b6a59baaa
228 lines
7.5 KiB
C#
228 lines
7.5 KiB
C#
//------------------------------------------------------------------------------
|
|
// <copyright file="SchemaElementDecl.cs" company="Microsoft">
|
|
// Copyright (c) Microsoft Corporation. All rights reserved.
|
|
// </copyright>
|
|
// <owner current="true" primary="true">Microsoft</owner>
|
|
//------------------------------------------------------------------------------
|
|
|
|
namespace System.Xml.Schema {
|
|
|
|
using System;
|
|
using System.Collections;
|
|
using System.Diagnostics;
|
|
using System.Collections.Generic;
|
|
|
|
internal sealed class SchemaElementDecl : SchemaDeclBase, IDtdAttributeListInfo {
|
|
Dictionary<XmlQualifiedName, SchemaAttDef> attdefs = new Dictionary<XmlQualifiedName, SchemaAttDef>();
|
|
List<IDtdDefaultAttributeInfo> defaultAttdefs;
|
|
bool isIdDeclared;
|
|
bool hasNonCDataAttribute = false;
|
|
|
|
#if !SILVERLIGHT
|
|
bool isAbstract = false;
|
|
bool isNillable = false;
|
|
bool hasRequiredAttribute = false;
|
|
bool isNotationDeclared;
|
|
Dictionary<XmlQualifiedName, XmlQualifiedName> prohibitedAttributes = new Dictionary<XmlQualifiedName, XmlQualifiedName>();
|
|
ContentValidator contentValidator;
|
|
XmlSchemaAnyAttribute anyAttribute;
|
|
XmlSchemaDerivationMethod block;
|
|
CompiledIdentityConstraint[] constraints;
|
|
XmlSchemaElement schemaElement;
|
|
|
|
internal static readonly SchemaElementDecl Empty = new SchemaElementDecl();
|
|
#endif
|
|
|
|
//
|
|
// Constructor
|
|
//
|
|
#if !SILVERLIGHT
|
|
internal SchemaElementDecl() {
|
|
}
|
|
|
|
internal SchemaElementDecl(XmlSchemaDatatype dtype) {
|
|
Datatype = dtype;
|
|
contentValidator = ContentValidator.TextOnly;
|
|
}
|
|
#endif
|
|
|
|
internal SchemaElementDecl(XmlQualifiedName name, String prefix)
|
|
: base(name, prefix) {
|
|
}
|
|
|
|
//
|
|
// Static methods
|
|
//
|
|
#if !SILVERLIGHT
|
|
internal static SchemaElementDecl CreateAnyTypeElementDecl() {
|
|
SchemaElementDecl anyTypeElementDecl = new SchemaElementDecl();
|
|
anyTypeElementDecl.Datatype = DatatypeImplementation.AnySimpleType.Datatype;
|
|
return anyTypeElementDecl;
|
|
}
|
|
#endif
|
|
|
|
//
|
|
// IDtdAttributeListInfo interface
|
|
//
|
|
#region IDtdAttributeListInfo Members
|
|
|
|
string IDtdAttributeListInfo.Prefix {
|
|
get { return ((SchemaElementDecl)this).Prefix; }
|
|
}
|
|
|
|
string IDtdAttributeListInfo.LocalName {
|
|
get { return ((SchemaElementDecl)this).Name.Name; }
|
|
}
|
|
|
|
bool IDtdAttributeListInfo.HasNonCDataAttributes {
|
|
get { return hasNonCDataAttribute; }
|
|
}
|
|
|
|
IDtdAttributeInfo IDtdAttributeListInfo.LookupAttribute(string prefix, string localName) {
|
|
XmlQualifiedName qname = new XmlQualifiedName(localName, prefix);
|
|
SchemaAttDef attDef;
|
|
if (attdefs.TryGetValue(qname, out attDef)) {
|
|
return attDef;
|
|
}
|
|
return null;
|
|
}
|
|
|
|
IEnumerable<IDtdDefaultAttributeInfo> IDtdAttributeListInfo.LookupDefaultAttributes() {
|
|
return defaultAttdefs;
|
|
}
|
|
|
|
IDtdAttributeInfo IDtdAttributeListInfo.LookupIdAttribute() {
|
|
foreach (SchemaAttDef attDef in attdefs.Values) {
|
|
if (attDef.TokenizedType == XmlTokenizedType.ID) {
|
|
return (IDtdAttributeInfo)attDef;
|
|
}
|
|
}
|
|
return null;
|
|
}
|
|
#endregion
|
|
|
|
//
|
|
// SchemaElementDecl properties
|
|
//
|
|
internal bool IsIdDeclared {
|
|
get { return isIdDeclared;}
|
|
set { isIdDeclared = value;}
|
|
}
|
|
|
|
internal bool HasNonCDataAttribute {
|
|
get { return hasNonCDataAttribute; }
|
|
set { hasNonCDataAttribute = value; }
|
|
}
|
|
|
|
#if !SILVERLIGHT
|
|
internal SchemaElementDecl Clone() {
|
|
return (SchemaElementDecl) MemberwiseClone();
|
|
}
|
|
|
|
internal bool IsAbstract {
|
|
get { return isAbstract;}
|
|
set { isAbstract = value;}
|
|
}
|
|
|
|
internal bool IsNillable {
|
|
get { return isNillable;}
|
|
set { isNillable = value;}
|
|
}
|
|
|
|
internal XmlSchemaDerivationMethod Block {
|
|
get { return block; }
|
|
set { block = value; }
|
|
}
|
|
|
|
internal bool IsNotationDeclared {
|
|
get { return isNotationDeclared; }
|
|
set { isNotationDeclared = value; }
|
|
}
|
|
|
|
internal bool HasDefaultAttribute {
|
|
get { return defaultAttdefs != null; }
|
|
}
|
|
|
|
internal bool HasRequiredAttribute {
|
|
get { return hasRequiredAttribute; }
|
|
set { hasRequiredAttribute = value; }
|
|
}
|
|
|
|
internal ContentValidator ContentValidator {
|
|
get { return contentValidator;}
|
|
set { contentValidator = value;}
|
|
}
|
|
|
|
internal XmlSchemaAnyAttribute AnyAttribute {
|
|
get { return anyAttribute; }
|
|
set { anyAttribute = value; }
|
|
}
|
|
|
|
internal CompiledIdentityConstraint[] Constraints {
|
|
get { return constraints; }
|
|
set { constraints = value; }
|
|
}
|
|
|
|
internal XmlSchemaElement SchemaElement {
|
|
get { return schemaElement;}
|
|
set { schemaElement = value;}
|
|
}
|
|
#endif
|
|
// add a new SchemaAttDef to the SchemaElementDecl
|
|
internal void AddAttDef(SchemaAttDef attdef) {
|
|
attdefs.Add(attdef.Name, attdef);
|
|
#if !SILVERLIGHT
|
|
if (attdef.Presence == SchemaDeclBase.Use.Required || attdef.Presence == SchemaDeclBase.Use.RequiredFixed) {
|
|
hasRequiredAttribute = true;
|
|
}
|
|
#endif
|
|
if (attdef.Presence == SchemaDeclBase.Use.Default || attdef.Presence == SchemaDeclBase.Use.Fixed) { //Not adding RequiredFixed here
|
|
if (defaultAttdefs == null) {
|
|
defaultAttdefs = new List<IDtdDefaultAttributeInfo>();
|
|
}
|
|
defaultAttdefs.Add(attdef);
|
|
}
|
|
}
|
|
|
|
/*
|
|
* Retrieves the attribute definition of the named attribute.
|
|
* @param name The name of the attribute.
|
|
* @return an attribute definition object; returns null if it is not found.
|
|
*/
|
|
internal SchemaAttDef GetAttDef(XmlQualifiedName qname) {
|
|
SchemaAttDef attDef;
|
|
if (attdefs.TryGetValue(qname, out attDef)) {
|
|
return attDef;
|
|
}
|
|
return null;
|
|
}
|
|
|
|
internal IList<IDtdDefaultAttributeInfo> DefaultAttDefs {
|
|
get { return defaultAttdefs; }
|
|
}
|
|
|
|
#if !SILVERLIGHT
|
|
internal Dictionary<XmlQualifiedName, SchemaAttDef> AttDefs {
|
|
get { return attdefs; }
|
|
}
|
|
|
|
internal Dictionary<XmlQualifiedName, XmlQualifiedName> ProhibitedAttributes {
|
|
get { return prohibitedAttributes; }
|
|
}
|
|
|
|
internal void CheckAttributes(Hashtable presence, bool standalone) {
|
|
foreach(SchemaAttDef attdef in attdefs.Values) {
|
|
if (presence[attdef.Name] == null) {
|
|
if (attdef.Presence == SchemaDeclBase.Use.Required) {
|
|
throw new XmlSchemaException(Res.Sch_MissRequiredAttribute, attdef.Name.ToString());
|
|
}
|
|
else if (standalone && attdef.IsDeclaredInExternal && (attdef.Presence == SchemaDeclBase.Use.Default || attdef.Presence == SchemaDeclBase.Use.Fixed)) {
|
|
throw new XmlSchemaException(Res.Sch_StandAlone, string.Empty);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
#endif
|
|
}
|
|
}
|