Skip to content

Commit c9268e6

Browse files
authored
Merge pull request #295 from aparshin/feature/naming-provider
Add original XSD elements to INamingProvider methods
2 parents 9c6f1dc + f1bc752 commit c9268e6

File tree

3 files changed

+99
-35
lines changed

3 files changed

+99
-35
lines changed
+63-11
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
namespace XmlSchemaClassGenerator
22
{
33
using System.Xml;
4+
using System.Xml.Schema;
45

56
public interface INamingProvider
67
{
@@ -9,39 +10,90 @@ public interface INamingProvider
910
/// </summary>
1011
/// <param name="typeModelName">Name of the typeModel</param>
1112
/// <param name="attributeName">Attribute name</param>
13+
/// <param name="attribute">Original XSD attribute</param>
1214
/// <returns>Name of the property</returns>
13-
string PropertyNameFromAttribute(string typeModelName, string attributeName);
15+
string PropertyNameFromAttribute(string typeModelName, string attributeName, XmlSchemaAttribute attribute);
1416

1517
/// <summary>
1618
/// Creates a name for a property from an element name
1719
/// </summary>
1820
/// <param name="typeModelName">Name of the typeModel</param>
1921
/// <param name="elementName">Element name</param>
22+
/// <param name="element">Original XSD element</param>
2023
/// <returns>Name of the property</returns>
21-
string PropertyNameFromElement(string typeModelName, string elementName);
24+
string PropertyNameFromElement(string typeModelName, string elementName, XmlSchemaElement element);
2225

2326
/// <summary>
2427
/// Creates a name for an enum member based on a value
2528
/// </summary>
2629
/// <param name="enumName">Name of the enum</param>
2730
/// <param name="value">Value name</param>
31+
/// <param name="xmlFacet">Original XSD enumeration facet</param>
2832
/// <returns>Name of the enum member</returns>
29-
string EnumMemberNameFromValue(string enumName, string value);
33+
string EnumMemberNameFromValue(string enumName, string value, XmlSchemaEnumerationFacet xmlFacet);
3034

31-
string ComplexTypeNameFromQualifiedName(XmlQualifiedName qualifiedName);
35+
/// <summary>
36+
/// Define the name to be used when a ComplexType is found in the XSD.
37+
/// </summary>
38+
/// <param name="qualifiedName">The name as defined in the XSD if present.</param>
39+
/// <param name="complexType">Original XSD ComplexType</param>
40+
/// <returns>A string with a valid C# identifier name.</returns>
41+
string ComplexTypeNameFromQualifiedName(XmlQualifiedName qualifiedName, XmlSchemaComplexType complexType);
3242

33-
string AttributeGroupTypeNameFromQualifiedName(XmlQualifiedName qualifiedName);
43+
/// <summary>
44+
/// Define the name to be used when a AttributeGroup is found in the XSD.
45+
/// </summary>
46+
/// <param name="qualifiedName">The name as defined in the XSD if present.</param>
47+
/// <param name="attributeGroup">Original XSD AttributeGroup</param>
48+
/// <returns>A string with a valid C# identifier name.</returns>
49+
string AttributeGroupTypeNameFromQualifiedName(XmlQualifiedName qualifiedName, XmlSchemaAttributeGroup attributeGroup);
3450

35-
string GroupTypeNameFromQualifiedName(XmlQualifiedName qualifiedName);
51+
/// <summary>
52+
/// Define the name to be used when a GroupType is found in the XSD.
53+
/// </summary>
54+
/// <param name="qualifiedName">The name as defined in the XSD if present.</param>
55+
/// <param name="group">Original XSD group</param>
56+
/// <returns>A string with a valid C# identifier name.</returns>
57+
string GroupTypeNameFromQualifiedName(XmlQualifiedName qualifiedName, XmlSchemaGroup group);
3658

37-
string SimpleTypeNameFromQualifiedName(XmlQualifiedName qualifiedName);
59+
/// <summary>
60+
/// Define the name to be used when a SimpleType is found in the XSD.
61+
/// </summary>
62+
/// <param name="qualifiedName">The name as defined in the XSD if present.</param>
63+
/// <param name="simpleType">Original XSD SimpleType</param>
64+
/// <returns>A string with a valid C# identifier name.</returns>
65+
string SimpleTypeNameFromQualifiedName(XmlQualifiedName qualifiedName, XmlSchemaSimpleType simpleType);
3866

39-
string RootClassNameFromQualifiedName(XmlQualifiedName qualifiedName);
67+
/// <summary>
68+
/// Define the name to be used for the root class.
69+
/// </summary>
70+
/// <param name="qualifiedName">The name as defined in the XSD if present.</param>
71+
/// <param name="xmlElement">Original XSD element</param>
72+
/// <returns>A string with a valid C# identifier name.</returns>
73+
string RootClassNameFromQualifiedName(XmlQualifiedName qualifiedName, XmlSchemaElement xmlElement);
4074

41-
string EnumTypeNameFromQualifiedName(XmlQualifiedName qualifiedName);
75+
/// <summary>
76+
/// Define the name to be used when an enum type is found in the XSD.
77+
/// </summary>
78+
/// <param name="qualifiedName">The name as defined in the XSD if present.</param>
79+
/// <param name="xmlSimpleType">Original XSD SimpleType</param>
80+
/// <returns>A string with a valid C# identifier name.</returns>
81+
string EnumTypeNameFromQualifiedName(XmlQualifiedName qualifiedName, XmlSchemaSimpleType xmlSimpleType);
4282

43-
string AttributeNameFromQualifiedName(XmlQualifiedName qualifiedName);
83+
/// <summary>
84+
/// Define the name to be used when an attribute is found in the XSD.
85+
/// </summary>
86+
/// <param name="qualifiedName">The name as defined in the XSD if present.</param>
87+
/// <param name="xmlAttribute">Original XSD attribute</param>
88+
/// <returns>A string with a valid C# identifier name.</returns>
89+
string AttributeNameFromQualifiedName(XmlQualifiedName qualifiedName, XmlSchemaAttribute xmlAttribute);
4490

45-
string ElementNameFromQualifiedName(XmlQualifiedName qualifiedName);
91+
/// <summary>
92+
/// Define the name of the C# class property from the element name in XSD.
93+
/// </summary>
94+
/// <param name="qualifiedName">The name as defined in the XSD if present.</param>
95+
/// <param name="xmlElement">Original XSD element</param>
96+
/// <returns>A string with a valid C# identifier name.</returns>
97+
string ElementNameFromQualifiedName(XmlQualifiedName qualifiedName, XmlSchemaElement xmlElement);
4698
}
4799
}

XmlSchemaClassGenerator/ModelBuilder.cs

+12-12
Original file line numberDiff line numberDiff line change
@@ -265,7 +265,7 @@ private void CreateElements(IEnumerable<XmlSchemaElement> elements)
265265

266266
derivedClassModel = new ClassModel(_configuration)
267267
{
268-
Name = _configuration.NamingProvider.RootClassNameFromQualifiedName(rootElement.QualifiedName),
268+
Name = _configuration.NamingProvider.RootClassNameFromQualifiedName(rootElement.QualifiedName, rootElement),
269269
Namespace = CreateNamespaceModel(elementSource, rootElement.QualifiedName)
270270
};
271271

@@ -291,7 +291,7 @@ private void CreateElements(IEnumerable<XmlSchemaElement> elements)
291291

292292
var originalClassModel = new ClassModel(_configuration)
293293
{
294-
Name = _configuration.NamingProvider.RootClassNameFromQualifiedName(type.RootElementName),
294+
Name = _configuration.NamingProvider.RootClassNameFromQualifiedName(type.RootElementName, rootElement),
295295
Namespace = classModel.Namespace
296296
};
297297

@@ -404,7 +404,7 @@ private TypeModel CreateTypeModel(Uri source, XmlSchemaAnnotated type, XmlQualif
404404

405405
private TypeModel CreateTypeModel(Uri source, XmlSchemaGroup group, NamespaceModel namespaceModel, XmlQualifiedName qualifiedName, List<DocumentationModel> docs)
406406
{
407-
var name = "I" + _configuration.NamingProvider.GroupTypeNameFromQualifiedName(qualifiedName);
407+
var name = "I" + _configuration.NamingProvider.GroupTypeNameFromQualifiedName(qualifiedName, group);
408408
if (namespaceModel != null) { name = namespaceModel.GetUniqueTypeName(name); }
409409

410410
var interfaceModel = new InterfaceModel(_configuration)
@@ -438,7 +438,7 @@ private TypeModel CreateTypeModel(Uri source, XmlSchemaGroup group, NamespaceMod
438438

439439
private TypeModel CreateTypeModel(Uri source, XmlSchemaAttributeGroup attributeGroup, NamespaceModel namespaceModel, XmlQualifiedName qualifiedName, List<DocumentationModel> docs)
440440
{
441-
var name = "I" + _configuration.NamingProvider.AttributeGroupTypeNameFromQualifiedName(qualifiedName);
441+
var name = "I" + _configuration.NamingProvider.AttributeGroupTypeNameFromQualifiedName(qualifiedName, attributeGroup);
442442
if (namespaceModel != null) { name = namespaceModel.GetUniqueTypeName(name); }
443443

444444
var interfaceModel = new InterfaceModel(_configuration)
@@ -470,7 +470,7 @@ private TypeModel CreateTypeModel(Uri source, XmlSchemaAttributeGroup attributeG
470470

471471
private TypeModel CreateTypeModel(Uri source, XmlSchemaComplexType complexType, NamespaceModel namespaceModel, XmlQualifiedName qualifiedName, List<DocumentationModel> docs)
472472
{
473-
var name = _configuration.NamingProvider.ComplexTypeNameFromQualifiedName(qualifiedName);
473+
var name = _configuration.NamingProvider.ComplexTypeNameFromQualifiedName(qualifiedName, complexType);
474474
if (namespaceModel != null)
475475
{
476476
name = namespaceModel.GetUniqueTypeName(name);
@@ -649,7 +649,7 @@ private TypeModel CreateTypeModel(XmlSchemaSimpleType simpleType, NamespaceModel
649649
if (isEnum)
650650
{
651651
// we got an enum
652-
var name = _configuration.NamingProvider.EnumTypeNameFromQualifiedName(qualifiedName);
652+
var name = _configuration.NamingProvider.EnumTypeNameFromQualifiedName(qualifiedName, simpleType);
653653
if (namespaceModel != null) { name = namespaceModel.GetUniqueTypeName(name); }
654654

655655
var enumModel = new EnumModel(_configuration)
@@ -667,7 +667,7 @@ private TypeModel CreateTypeModel(XmlSchemaSimpleType simpleType, NamespaceModel
667667
{
668668
var value = new EnumValueModel
669669
{
670-
Name = _configuration.NamingProvider.EnumMemberNameFromValue(enumModel.Name, facet.Value),
670+
Name = _configuration.NamingProvider.EnumMemberNameFromValue(enumModel.Name, facet.Value, facet),
671671
Value = facet.Value
672672
};
673673

@@ -699,7 +699,7 @@ private TypeModel CreateTypeModel(XmlSchemaSimpleType simpleType, NamespaceModel
699699
restrictions = GetRestrictions(facets, simpleType).Where(r => r != null).Sanitize().ToList();
700700
}
701701

702-
var simpleModelName = _configuration.NamingProvider.SimpleTypeNameFromQualifiedName(qualifiedName);
702+
var simpleModelName = _configuration.NamingProvider.SimpleTypeNameFromQualifiedName(qualifiedName, simpleType);
703703
if (namespaceModel != null) { simpleModelName = namespaceModel.GetUniqueTypeName(simpleModelName); }
704704

705705
var simpleModel = new SimpleModel(_configuration)
@@ -756,7 +756,7 @@ private IEnumerable<PropertyModel> CreatePropertiesForAttributes(Uri source, Typ
756756
if (attribute.Use != XmlSchemaUse.Prohibited)
757757
{
758758
var attributeQualifiedName = attribute.AttributeSchemaType.QualifiedName;
759-
var attributeName = _configuration.NamingProvider.AttributeNameFromQualifiedName(attribute.QualifiedName);
759+
var attributeName = _configuration.NamingProvider.AttributeNameFromQualifiedName(attribute.QualifiedName, attribute);
760760

761761
if (attribute.Parent is XmlSchemaAttributeGroup attributeGroup
762762
&& attributeGroup.QualifiedName != typeModel.XmlSchemaName
@@ -776,7 +776,7 @@ private IEnumerable<PropertyModel> CreatePropertiesForAttributes(Uri source, Typ
776776
if (attributeQualifiedName.IsEmpty || string.IsNullOrEmpty(attributeQualifiedName.Namespace))
777777
{
778778
// inner type, have to generate a type name
779-
var typeName = _configuration.NamingProvider.PropertyNameFromAttribute(typeModel.Name, attribute.QualifiedName.Name);
779+
var typeName = _configuration.NamingProvider.PropertyNameFromAttribute(typeModel.Name, attribute.QualifiedName.Name, attribute);
780780
attributeQualifiedName = new XmlQualifiedName(typeName, typeModel.XmlSchemaName.Namespace);
781781
// try to avoid name clashes
782782
if (NameExists(attributeQualifiedName))
@@ -864,7 +864,7 @@ private IEnumerable<PropertyModel> CreatePropertiesForElements(Uri source, TypeM
864864
{
865865
// inner type, have to generate a type name
866866
var typeModelName = xmlParticle is XmlSchemaGroupRef groupRef ? groupRef.RefName : typeModel.XmlSchemaName;
867-
var typeName = _configuration.NamingProvider.PropertyNameFromElement(typeModelName.Name, element.QualifiedName.Name);
867+
var typeName = _configuration.NamingProvider.PropertyNameFromElement(typeModelName.Name, element.QualifiedName.Name, element);
868868
elementQualifiedName = new XmlQualifiedName(typeName, typeModel.XmlSchemaName.Namespace);
869869
// try to avoid name clashes
870870
if (NameExists(elementQualifiedName))
@@ -877,7 +877,7 @@ private IEnumerable<PropertyModel> CreatePropertiesForElements(Uri source, TypeM
877877
}
878878

879879
var effectiveElement = substitute?.Element ?? element;
880-
var propertyName = _configuration.NamingProvider.ElementNameFromQualifiedName(effectiveElement.QualifiedName);
880+
var propertyName = _configuration.NamingProvider.ElementNameFromQualifiedName(effectiveElement.QualifiedName, effectiveElement);
881881
var originalPropertyName = propertyName;
882882
if (propertyName == typeModel.Name)
883883
{

0 commit comments

Comments
 (0)