Skip to content

Commit b97f118

Browse files
committed
More work on extension methods to traverse an entire XSD graph for simple types and unions.
1 parent cbb6949 commit b97f118

4 files changed

Lines changed: 56 additions & 17 deletions

File tree

XObjectsCode/Extensions/XmlSchemaExtensions.cs

Lines changed: 33 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
using System;
1+
#nullable enable
2+
using System;
23
using System.Collections.Generic;
34
using System.IO;
45
using System.Linq;
@@ -61,6 +62,11 @@ private static void TraverseAllSimpleTypes(XmlSchemaObject schemaObject, ref Dic
6162

6263
bool didAdd = true;
6364
switch (schemaObject) {
65+
case XmlSchemaAttribute attribute: {
66+
didAdd = simpleTypes.AddIfNotAlreadyExists(attribute, attribute.AttributeSchemaType);
67+
break;
68+
}
69+
6470
case XmlSchemaElement element: {
6571
if (element.ElementSchemaType is XmlSchemaSimpleType simpleType) {
6672
didAdd = simpleTypes.AddIfNotAlreadyExists(element, simpleType);
@@ -92,12 +98,7 @@ private static void TraverseAllSimpleTypes(XmlSchemaObject schemaObject, ref Dic
9298
break;
9399
}
94100

95-
case XmlSchemaAttribute attribute: {
96-
didAdd = simpleTypes.AddIfNotAlreadyExists(attribute, attribute.AttributeSchemaType);
97-
break;
98-
}
99-
100-
case XmlSchemaComplexType complexType:
101+
case XmlSchemaComplexType complexType: {
101102
foreach (var attribute in complexType.AttributeUses.Values.OfType<XmlSchemaAttribute>()) {
102103
if (attribute.AttributeSchemaType is { } simpleType) {
103104
didAdd = simpleTypes.AddIfNotAlreadyExists(attribute, simpleType);
@@ -110,20 +111,42 @@ private static void TraverseAllSimpleTypes(XmlSchemaObject schemaObject, ref Dic
110111
}
111112

112113
break;
114+
}
115+
116+
case XmlSchemaGroupBase groupBase: {
117+
OneOf<XmlSchemaAll, XmlSchemaSequence, XmlSchemaChoice> matchModel = default;
118+
if (groupBase is XmlSchemaAll all) { matchModel = all; }
119+
else if (groupBase is XmlSchemaSequence seq) { matchModel = seq; }
120+
else if (groupBase is XmlSchemaChoice choice) { matchModel = choice; }
113121

114-
case XmlSchemaGroupBase groupBase when groupBase is XmlSchemaAll all:
115-
foreach (var item in all.Items) {
122+
foreach (var item in matchModel.Match(a => a.Items, s => s.Items, c => c.Items)) {
116123
TraverseAllSimpleTypes(item, ref simpleTypes, out breakOutOfLoop);
117124
if (breakOutOfLoop) return;
118125
}
119126

120127
break;
121-
128+
}
122129
}
123130

124131
breakOutOfLoop = !didAdd;
125132
}
126133

134+
public static bool IsOfAnonymousType(this XmlSchemaAttribute attr)
135+
{
136+
return attr.SchemaType != null && !(
137+
(attr.AttributeSchemaType?.IsGlobal()).GetValueOrDefault() &&
138+
(attr.AttributeSchemaType?.IsBuiltInSimpleType()).GetValueOrDefault()
139+
);
140+
}
141+
142+
public static bool IsOfAnonymousType(this XmlSchemaElement el)
143+
{
144+
return el.SchemaType != null && !(
145+
(el.ElementSchemaType?.IsGlobal()).GetValueOrDefault() &&
146+
(el.ElementSchemaType?.IsBuiltInSimpleType()).GetValueOrDefault()
147+
);
148+
}
149+
127150
/// <summary>
128151
/// Returns true or false if the current <paramref name="attribute"/> defines an inline enumeration of values.
129152
/// </summary>

XObjectsCode/Src/SOMQueryExtensions.cs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,13 @@ public static bool IsBuiltInSimpleType(this XmlSchemaSimpleType derivedType)
9999
}
100100
}
101101

102+
public static bool IsBuiltInSimpleType(this XmlSchemaType type)
103+
{
104+
if (type is XmlSchemaSimpleType a) return a.IsBuiltInSimpleType();
105+
106+
return false;
107+
}
108+
102109
public static XmlSchemaSimpleType GetListItemType(this XmlSchemaSimpleType type)
103110
{
104111
Debug.Assert(type != null);

XObjectsTests/Extensions/FileExtensions.cs

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ public static XDocument ToXDocument(this IFileInfo fileInfo)
2020
return XDocument.Load(fileInfo.ToStreamReader());
2121
}
2222

23-
public static XmlSchemaSet ReadAsXmlSchemaInstance(this IFileInfo fileInfo, XmlResolver resolver)
23+
public static XmlSchemaSet ReadAsXmlSchemaSet(this IFileInfo fileInfo, XmlResolver resolver)
2424
{
2525
if (resolver == null) throw new ArgumentNullException(nameof(resolver));
2626

@@ -32,4 +32,13 @@ public static XmlSchemaSet ReadAsXmlSchemaInstance(this IFileInfo fileInfo, XmlR
3232

3333
return xsd;
3434
}
35+
36+
public static XmlSchemaSet ReadAsXmlSchemaDefinition(this IFileInfo fileInfo)
37+
{
38+
using var sr = new StreamReader(fileInfo.OpenRead());
39+
var reader = XmlReader.Create(sr, Defaults.DefaultXmlReaderSettings);
40+
var xsd = reader.ToXmlSchemaSet();
41+
42+
return xsd;
43+
}
3544
}

XObjectsTests/Extensions/XmlSchemaExtensionsTests.cs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -88,33 +88,33 @@ public void TestRetrieveAllAnonymousSimpleTypes_OPML()
8888
{
8989
var opmlFile = AllTestFiles.AllFiles.SingleOrDefault(f => f.EndsWith("Opml\\opml2.xsd"));
9090
Assert.NotNull(opmlFile);
91-
var opmlXsd = AllTestFiles.FileInfo.New(opmlFile).ReadAsXmlSchemaInstance(MockXmlFileResolver);
91+
var opmlXsd = AllTestFiles.FileInfo.New(opmlFile).ReadAsXmlSchemaSet(MockXmlFileResolver);
9292

9393
var anonTypes = opmlXsd.RetrieveAllAnonymousSimpleTypes();
9494

9595
Assert.NotNull(anonTypes);
96-
Assert.IsEmpty(anonTypes);
96+
Assert.IsNotEmpty(anonTypes);
9797
}
9898

9999
[Test]
100100
public void TestRetrieveAllAnonymousSimpleTypes_StuDateAndTime()
101101
{
102102
var file = AllTestFiles.AllFiles.SingleOrDefault(f => f.EndsWith("StuDateAndTime.xsd"));
103103
Assert.NotNull(file);
104-
var xsd = AllTestFiles.FileInfo.New(file).ReadAsXmlSchemaInstance(MockXmlFileResolver);
104+
var xsd = AllTestFiles.FileInfo.New(file).ReadAsXmlSchemaSet(MockXmlFileResolver);
105105

106106
var anonTypes = xsd.RetrieveAllAnonymousSimpleTypes();
107107

108108
Assert.NotNull(anonTypes);
109-
Assert.IsEmpty(anonTypes);
109+
Assert.IsNotEmpty(anonTypes);
110110
}
111111

112112
[Test]
113113
public void TestRetrieveAllAnonymousSimpleUnionTypes_AkomaNtoso()
114114
{
115115
var opmlFile = AllTestFiles.AllFiles.SingleOrDefault(f => f.EndsWith("\\AkomaNtoso\\akomantoso30.xsd"));
116116
Assert.NotNull(opmlFile);
117-
var opmlXsd = AllTestFiles.FileInfo.New(opmlFile).ReadAsXmlSchemaInstance(MockXmlFileResolver);
117+
var opmlXsd = AllTestFiles.FileInfo.New(opmlFile).ReadAsXmlSchemaSet(MockXmlFileResolver);
118118

119119
var anonUnionTypes = opmlXsd.RetrieveAllAnonymousSimpleUnionTypes();
120120

@@ -127,7 +127,7 @@ public void TestRetrieveAllSimpleTypes_AkomaNtoso()
127127
{
128128
var opmlFile = AllTestFiles.AllFiles.SingleOrDefault(f => f.EndsWith("\\AkomaNtoso\\akomantoso30.xsd"));
129129
Assert.NotNull(opmlFile);
130-
var opmlXsd = AllTestFiles.FileInfo.New(opmlFile).ReadAsXmlSchemaInstance(MockXmlFileResolver);
130+
var opmlXsd = AllTestFiles.FileInfo.New(opmlFile).ReadAsXmlSchemaSet(MockXmlFileResolver);
131131

132132
var anonUnionTypes = opmlXsd.RetrieveAllSimpleTypes();
133133

0 commit comments

Comments
 (0)