XmlSchemaClassGenerator icon indicating copy to clipboard operation
XmlSchemaClassGenerator copied to clipboard

[Required] Attribute

Open vytcus opened this issue 7 years ago • 3 comments

Hi, I've started using this tool instead of xsd.exe and so far it has been a godsend. However, I notice that the "minOccurs", "maxOccurs" restrictions are not reflected on the generated classes (no [required] attribute or similar). Is this part of the functionallity?

Thank you.

vytcus avatar Oct 10 '18 10:10 vytcus

The DataAnnotation attributes are only emitted for XML schema simple types with restrictions, e.g.

<xs:simpleType name="Password">
    <xs:restriction base="xs:string">
        <xs:minLength value="5"/>
        <xs:maxLength value="40"/>
    </xs:restriction>
</xs:simpleType>

results in

[System.ComponentModel.DataAnnotations.MinLengthAttribute(5)]
[System.ComponentModel.DataAnnotations.MaxLengthAttribute(40)]
public string Password { get; set; }

mganss avatar Oct 10 '18 11:10 mganss

Cheers for the answer. That clarified things, hope you don't mind answering another one. Some other annotations are not reflected in the class too. Here's the schema:

<xsd:complexType name='FooType'>
		<xsd:annotation>
			<xsd:documentation xml:lang="en">
				<ccts:UniqueID>123</ccts:UniqueID>
				<ccts:ObjectClassQualifierTerm>ENUM</ccts:ObjectClassQualifierTerm>
				<ccts:OfficialConstraintContextValue>
					<CodeListEntry><value>01</value><definition>Male</definition></CodeListEntry>
					<CodeListEntry><value>02</value><definition>Female</definition></CodeListEntry>
				</ccts:OfficialConstraintContextValue>
			</xsd:documentation>
		</xsd:annotation>
		<xsd:sequence>
			<xsd:element name='value' minOccurs='1' maxOccurs='1'>
				<xsd:simpleType>
					<xsd:restriction base='xsd:string'>
						<xsd:pattern value='(01|02){1}'/>
					</xsd:restriction>
				</xsd:simpleType>
			</xsd:element>
		</xsd:sequence>
	</xsd:complexType>
}

I get

/// <summary>
    /// <para xml:lang="en">123</para>
    /// </summary>
    [System.CodeDom.Compiler.GeneratedCodeAttribute("XmlSchemaClassGenerator", "2.0.174.0")]
    [System.ComponentModel.DesignerCategoryAttribute("code")]
    public partial class FooType
    {
        
        /// <summary>
        /// <para xml:lang="en">Pattern: (01|02){1}.</para>
        /// </summary>
        [System.ComponentModel.DataAnnotations.RegularExpressionAttribute("(01|02){1}")]
        [System.Xml.Serialization.XmlElementAttribute("value", Form=System.Xml.Schema.XmlSchemaForm.Unqualified, DataType="string")]
        public string Value { get; set; }
    }

Basically, what's inside <ccts:ObjectClassQualifierTerm> and <ccts:OfficialConstraintContextValue> elements did not get represented in the generated class. Any reason why?

Again, thank you for you answers.

vytcus avatar Oct 10 '18 12:10 vytcus

We're only getting the text of the first element from within the xs:documentation element. Most documentation contains only raw text and no markup. Using the markup would lead to illegal XML comments and compiler warnings. We could use the concatenated text from all child nodes.

mganss avatar Oct 10 '18 13:10 mganss