/// <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; } } }
private void expandImports(SchemaMap map) { foreach (IXsdNode node in GetAllNodes()) { XsdImportInclude inc = node as XsdImportInclude; if (inc != null) { string sl = inc.SchemaLocation; if (map != null) { if (!(sl.Contains("/") || sl.Contains("\\"))) { sl = Path.Combine(Path.GetDirectoryName(_filename), sl); } SchemaParser schema = map.Get(sl); if (schema == null) { if (map.OpenAllDontAsk) { schema = new SchemaParser(sl, map); map.Add(sl, schema); } else { Cursor cursor = Mouse.OverrideCursor; Mouse.OverrideCursor = null; TaskDialogResult res = TaskDialog.Show( new TaskDialogOptions { AllowDialogCancellation = true, Owner = Application.Current.MainWindow, Title = "Update xsd location", MainInstruction = "Open schema " + sl + " ?", //Content = "Old location:\n" + Data.ValidationData.Xsd + "\nUpdated location:\n" + newXsdLocation, CommandButtons = new[] { "Yes", "Yes, all", "No" }, MainIcon = VistaTaskDialogIcon.Information, //ExpandedInfo = "Source: " + source.XPath + "\nTarget: " + target.XPath }); switch (res.CommandButtonResult) { case 0: //yes schema = new SchemaParser(sl, map); map.Add(sl, schema); break; case 1: //open all map.OpenAllDontAsk = true; schema = new SchemaParser(sl, map); map.Add(sl, schema); break; case 2: //no case null: //cancel break; } Mouse.OverrideCursor = cursor; } } if (schema != null) { var xn = schema.GetVirtualRoot(); ((XsdNode)node).AddKids(xn); } } } } }