| File: System\Xml\Schema\XmlSchemaElement.cs | Web Access |
| Project: src\runtime\src\libraries\System.Private.Xml\src\System.Private.Xml.csproj (System.Private.Xml) |
// Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. using System.ComponentModel; using System.Diagnostics; using System.Diagnostics.CodeAnalysis; using System.Xml.Serialization; namespace System.Xml.Schema { public class XmlSchemaElement : XmlSchemaParticle { private bool _isAbstract; private bool _hasAbstractAttribute; private bool _isNillable; private bool _hasNillableAttribute; private bool _isLocalTypeDerivationChecked; private XmlSchemaDerivationMethod _block = XmlSchemaDerivationMethod.None; private XmlSchemaDerivationMethod _final = XmlSchemaDerivationMethod.None; private XmlSchemaForm _form = XmlSchemaForm.None; private string? _defaultValue; private string? _fixedValue; private string? _name; private XmlQualifiedName _refName = XmlQualifiedName.Empty; private XmlQualifiedName _substitutionGroup = XmlQualifiedName.Empty; private XmlQualifiedName _typeName = XmlQualifiedName.Empty; private XmlSchemaType? _type; private XmlQualifiedName _qualifiedName = XmlQualifiedName.Empty; private XmlSchemaType? _elementType; private XmlSchemaDerivationMethod _blockResolved; private XmlSchemaDerivationMethod _finalResolved; private XmlSchemaObjectCollection? _constraints; private SchemaElementDecl? _elementDecl; [XmlAttribute("abstract"), DefaultValue(false)] public bool IsAbstract { get { return _isAbstract; } set { _isAbstract = value; _hasAbstractAttribute = true; } } [XmlAttribute("block"), DefaultValue(XmlSchemaDerivationMethod.None)] public XmlSchemaDerivationMethod Block { get { return _block; } set { _block = value; } } [XmlAttribute("default")] [DefaultValue(null)] public string? DefaultValue { get { return _defaultValue; } set { _defaultValue = value; } } [XmlAttribute("final"), DefaultValue(XmlSchemaDerivationMethod.None)] public XmlSchemaDerivationMethod Final { get { return _final; } set { _final = value; } } [XmlAttribute("fixed")] [DefaultValue(null)] public string? FixedValue { get { return _fixedValue; } set { _fixedValue = value; } } [XmlAttribute("form"), DefaultValue(XmlSchemaForm.None)] public XmlSchemaForm Form { get { return _form; } set { _form = value; } } [XmlAttribute("name"), DefaultValue("")] public string? Name { get { return _name; } set { _name = value; } } [XmlAttribute("nillable"), DefaultValue(false)] public bool IsNillable { get { return _isNillable; } set { _isNillable = value; _hasNillableAttribute = true; } } [XmlIgnore] internal bool HasNillableAttribute { get { return _hasNillableAttribute; } } [XmlIgnore] internal bool HasAbstractAttribute { get { return _hasAbstractAttribute; } } [XmlAttribute("ref")] [AllowNull] public XmlQualifiedName RefName { get { return _refName; } set { _refName = value ?? XmlQualifiedName.Empty; } } [XmlAttribute("substitutionGroup")] [AllowNull] public XmlQualifiedName SubstitutionGroup { get { return _substitutionGroup; } set { _substitutionGroup = value ?? XmlQualifiedName.Empty; } } [XmlAttribute("type")] [AllowNull] public XmlQualifiedName SchemaTypeName { get { return _typeName; } set { _typeName = value ?? XmlQualifiedName.Empty; } } [XmlElement("complexType", typeof(XmlSchemaComplexType)), XmlElement("simpleType", typeof(XmlSchemaSimpleType))] public XmlSchemaType? SchemaType { get { return _type; } set { _type = value; } } [XmlElement("key", typeof(XmlSchemaKey)), XmlElement("keyref", typeof(XmlSchemaKeyref)), XmlElement("unique", typeof(XmlSchemaUnique))] public XmlSchemaObjectCollection Constraints => _constraints ??= new XmlSchemaObjectCollection(); [XmlIgnore] public XmlQualifiedName QualifiedName { get { return _qualifiedName; } } [XmlIgnore] [Obsolete("XmlSchemaElement.ElementType has been deprecated. Use the ElementSchemaType property that returns a strongly typed element type instead.")] public object? ElementType { get { if (_elementType == null) return null; if (_elementType.QualifiedName.Namespace == XmlReservedNs.NsXs) { return _elementType.Datatype; //returns XmlSchemaDatatype; } return _elementType; } } [XmlIgnore] public XmlSchemaType? ElementSchemaType { get { return _elementType; } } [XmlIgnore] public XmlSchemaDerivationMethod BlockResolved { get { return _blockResolved; } } [XmlIgnore] public XmlSchemaDerivationMethod FinalResolved { get { return _finalResolved; } } [return: NotNullIfNotNull(nameof(schemaSet))] internal XmlReader? Validate(XmlReader reader, XmlResolver? resolver, XmlSchemaSet schemaSet, ValidationEventHandler valEventHandler) { if (schemaSet != null) { XmlReaderSettings readerSettings = new XmlReaderSettings(); readerSettings.ValidationType = ValidationType.Schema; readerSettings.Schemas = schemaSet; readerSettings.ValidationEventHandler += valEventHandler; return new XsdValidatingReader(reader, resolver, readerSettings, this); } return null; } internal void SetQualifiedName(XmlQualifiedName value) { _qualifiedName = value; } internal void SetElementType(XmlSchemaType? value) { _elementType = value; } internal void SetBlockResolved(XmlSchemaDerivationMethod value) { _blockResolved = value; } internal void SetFinalResolved(XmlSchemaDerivationMethod value) { _finalResolved = value; } [XmlIgnore] internal bool HasDefault { get { return _defaultValue != null && _defaultValue.Length > 0; } } internal bool HasConstraints { get { return _constraints != null && _constraints.Count > 0; } } internal bool IsLocalTypeDerivationChecked { get { return _isLocalTypeDerivationChecked; } set { _isLocalTypeDerivationChecked = value; } } internal SchemaElementDecl? ElementDecl { get { return _elementDecl; } set { _elementDecl = value; } } [XmlIgnore] internal override string? NameAttribute { get { return Name; } set { Name = value; } } [XmlIgnore] internal override string NameString { get { return _qualifiedName.ToString(); } } internal override XmlSchemaObject Clone() { System.Diagnostics.Debug.Fail("Should never call Clone() on XmlSchemaElement. Call Clone(XmlSchema) instead."); return Clone(null); } internal XmlSchemaObject Clone(XmlSchema? parentSchema) { XmlSchemaElement newElem = (XmlSchemaElement)MemberwiseClone(); //Deep clone the QNames as these will be updated on chameleon includes newElem._refName = _refName.Clone(); newElem._substitutionGroup = _substitutionGroup.Clone(); newElem._typeName = _typeName.Clone(); newElem._qualifiedName = _qualifiedName.Clone(); // If this element has a complex type which is anonymous (declared in place with the element) // it needs to be cloned as well, since it may contain named elements and such. And these names // will need to be cloned since they may change their namespace on chameleon includes XmlSchemaComplexType? complexType = _type as XmlSchemaComplexType; if (complexType != null && complexType.QualifiedName.IsEmpty) { newElem._type = (XmlSchemaType)complexType.Clone(parentSchema); } //Clear compiled tables newElem._constraints = null; return newElem; } } }