private SchemaParser(string schemafile, SchemaMap map) { _filename = schemafile; XmlDocument doc = new XmlDocument(); doc.Load(schemafile); XmlNode e = doc.DocumentElement; if (!e.Name.EndsWith("schema")) { throw new Exception("No schema"); } _prefix = e.Name.Substring(0, e.Name.Length - 6); _virtualRoot = new XsdSchema(e); parse(e, _virtualRoot); expandImports(map); expandReferences(); }
/// <summary> /// Parses the schema and adds the found items to node /// </summary> /// <param name="schema"></param> /// <param name="node"></param> private void parse(XmlNode schema, XsdNode node) { XmlNodeList nl = schema.ChildNodes; for (int i = 0; i < nl.Count; i++) { XmlNode n = nl.Item(i); string name = n.Name; if (!name.StartsWith(_prefix)) { continue; } name = name.Substring(_prefix.Length); switch (name) { case "element": { XsdNode newNode = new XsdElement(n); node.AddKids(newNode); parse(n, newNode); break; } case "sequence": case "choice": case "all": { XsdNode newNode = new XsdAllSequenceChoice(n, name); node.AddKids(newNode); parse(n, newNode); break; } case "documentation": { //last element node.AddAnnotation(n.InnerText); break; } case "attribute": { XsdAttribute newAttr = new XsdAttribute(n); ((IXsdHasAttribute)node).AddAtts(newAttr); parse(n, newAttr); break; } case "complexType": { if (!string.IsNullOrEmpty(VisualizerHelper.GetAttr(n, "name"))) { XsdComplexType newType = new XsdComplexType(n); node.AddKids(newType); parse(n, newType); } else { parse(n, node); } break; } case "simpleType": { if (!string.IsNullOrEmpty(VisualizerHelper.GetAttr(n, "name"))) { XsdSimpleType newType = new XsdSimpleType(n); node.AddKids(newType); parse(n, newType); } else { parse(n, node); } break; } case "annotation": { parse(n, node); break; } case "restriction": { XsdNode newNode = new XsdRestriction(n); node.AddKids(newNode); parse(n, newNode); break; } case "enumeration": { string value = VisualizerHelper.GetAttr(n, "value"); ((XsdRestriction)node).AddEnum(value); break; } case "pattern": { string value = VisualizerHelper.GetAttr(n, "value"); ((XsdRestriction)node).Pattern = value; break; } case "length": { string value = VisualizerHelper.GetAttr(n, "value"); ((XsdRestriction)node).Length = value; break; } case "maxLength": { string value = VisualizerHelper.GetAttr(n, "value"); ((XsdRestriction)node).MaxLength = value; break; } case "minLength": { string value = VisualizerHelper.GetAttr(n, "value"); ((XsdRestriction)node).MinLength = value; break; } case "maxInclusive": { string value = VisualizerHelper.GetAttr(n, "value"); ((XsdRestriction)node).MaxInclusive = value; break; } case "maxExclusive": { string value = VisualizerHelper.GetAttr(n, "value"); ((XsdRestriction)node).MaxExclusive = value; break; } case "minInclusive": { string value = VisualizerHelper.GetAttr(n, "value"); ((XsdRestriction)node).MinInclusive = value; break; } case "minExclusive": { string value = VisualizerHelper.GetAttr(n, "value"); ((XsdRestriction)node).MinExclusive = value; break; } case "notation": case "schema": case "appInfo": case "group": case "#comment": case "#text": case "key": case "keyref": case "unique": //ignore break; case "any": { XsdNode newNode = new XsdAny(n); node.AddKids(newNode); parse(n, newNode); break; } case "import": case "include": { XsdNode newNode = new XsdImportInclude(n, name); node.AddKids(newNode); parse(n, newNode); break; } case "complexContent": case "simpleContent": { parse(n, node); break; } case "extension": { XsdNode newNode = new XsdExtension(n); node.AddKids(newNode); parse(n, newNode); break; } case "anyAttribute": case "attributeGroup": case "field": case "list": case "redefine": case "selector": case "union": Debug.Fail("Not supported: " + name); Console.Error.WriteLine("Not supported: " + name); break; default: Debug.Fail("Unknown type: " + name); break; } } }