@@ -137,7 +137,7 @@ private void CreateSubstitutes()
137
137
138
138
private void AddXmlRootAttributeToAmbiguousTypes ( )
139
139
{
140
- var ambiguousTypes = Types . Values . Where ( t=> t . RootElementName == null && ! ( t is InterfaceModel ) ) . GroupBy ( t => t . Name ) ;
140
+ var ambiguousTypes = Types . Values . Where ( t => t . RootElementName == null && ! t . IsAbstractRoot && ! ( t is InterfaceModel ) ) . GroupBy ( t => t . Name ) ;
141
141
foreach ( var ambiguousTypeGroup in ambiguousTypes )
142
142
{
143
143
var types = ambiguousTypeGroup . ToList ( ) ;
@@ -253,7 +253,7 @@ private void CreateElements(IEnumerable<XmlSchemaElement> elements)
253
253
var type = CreateTypeModel ( typeSource , rootElement . ElementSchemaType , qualifiedName ) ;
254
254
ClassModel derivedClassModel = null ;
255
255
256
- if ( type . RootElementName != null )
256
+ if ( type . RootElementName != null || type . IsAbstractRoot )
257
257
{
258
258
if ( type is ClassModel classModel )
259
259
{
@@ -283,6 +283,49 @@ private void CreateElements(IEnumerable<XmlSchemaElement> elements)
283
283
( ( ClassModel ) derivedClassModel . BaseClass ) . DerivedTypes . Add ( derivedClassModel ) ;
284
284
285
285
derivedClassModel . RootElementName = rootElement . QualifiedName ;
286
+
287
+ if ( ! type . IsAbstractRoot )
288
+ {
289
+ // Also create an empty derived class for the original root element
290
+
291
+ var originalClassModel = new ClassModel ( _configuration )
292
+ {
293
+ Name = _configuration . NamingProvider . RootClassNameFromQualifiedName ( type . RootElementName ) ,
294
+ Namespace = classModel . Namespace
295
+ } ;
296
+
297
+ originalClassModel . Documentation . AddRange ( classModel . Documentation ) ;
298
+ classModel . Documentation . Clear ( ) ;
299
+
300
+ if ( originalClassModel . Namespace != null )
301
+ {
302
+ originalClassModel . Name = originalClassModel . Namespace . GetUniqueTypeName ( originalClassModel . Name ) ;
303
+ originalClassModel . Namespace . Types [ originalClassModel . Name ] = originalClassModel ;
304
+ }
305
+
306
+ if ( classModel . XmlSchemaName != null && ! classModel . XmlSchemaName . IsEmpty )
307
+ {
308
+ key = BuildKey ( classModel . RootElement , classModel . XmlSchemaName ) ;
309
+ Types [ key ] = originalClassModel ;
310
+ }
311
+
312
+ originalClassModel . BaseClass = classModel ;
313
+ ( ( ClassModel ) originalClassModel . BaseClass ) . DerivedTypes . Add ( originalClassModel ) ;
314
+
315
+ originalClassModel . RootElementName = type . RootElementName ;
316
+
317
+ if ( classModel . RootElement . SubstitutionGroup != null
318
+ && SubstitutionGroups . TryGetValue ( classModel . RootElement . SubstitutionGroup , out var substitutes ) )
319
+ {
320
+ foreach ( var substitute in substitutes . Where ( s => s . Element == classModel . RootElement ) )
321
+ {
322
+ substitute . Type = originalClassModel ;
323
+ }
324
+ }
325
+
326
+ classModel . RootElementName = null ;
327
+ classModel . IsAbstractRoot = true ;
328
+ }
286
329
}
287
330
else
288
331
{
@@ -297,6 +340,7 @@ private void CreateElements(IEnumerable<XmlSchemaElement> elements)
297
340
classModel . Documentation . AddRange ( GetDocumentation ( rootElement ) ) ;
298
341
}
299
342
343
+ type . RootElement = rootElement ;
300
344
type . RootElementName = rootElement . QualifiedName ;
301
345
}
302
346
0 commit comments