static int Main(string[] args) { if (args.Length < 2) { Console.WriteLine("Usage: MakeNLogXSD outputfile.xsd path_to_doc.xml"); return 1; } var factories = new NLogFactories(); try { docXml.Load(args[1]); for (int i = 2; i < args.Length; ++i) { try { Assembly asm = Assembly.Load(args[i]); factories.RegisterItemsFromAssembly(asm, ""); } catch (Exception ex) { Console.WriteLine("WARNING: {0}", ex.Message); } } StringWriter sw = new StringWriter(); sw.Write("<root xmlns:xs=\"http://www.w3.org/2001/XMLSchema\">"); XmlTextWriter xtw = new XmlTextWriter(sw); xtw.Namespaces = false; xtw.Formatting = Formatting.Indented; typeDumped[typeof(object)] = 1; typeDumped[typeof(Target)] = 1; typeDumped[typeof(TargetWithLayout)] = 1; typeDumped[typeof(TargetWithLayoutHeaderAndFooter)] = 1; typeDumped[typeof(Layout)] = 1; foreach (var target in factories.TargetFactory.AllRegisteredItems) { DumpType(xtw, target.Value); } foreach (var filter in factories.FilterFactory.AllRegisteredItems) { DumpType(xtw, filter.Value); } foreach (var layout in factories.LayoutFactory.AllRegisteredItems) { DumpType(xtw, layout.Value); } xtw.Flush(); sw.Write("</root>"); sw.Flush(); XmlDocument doc2 = new XmlDocument(); doc2.LoadXml(sw.ToString()); using (Stream templateStream = Assembly.GetEntryAssembly().GetManifestResourceStream("MakeNLogXSD.TemplateNLog.xsd")) { XmlDocument doc = new XmlDocument(); doc.Load(templateStream); XmlNamespaceManager nsmgr = new XmlNamespaceManager(doc.NameTable); nsmgr.AddNamespace("", "http://www.w3.org/2001/XMLSchema"); XmlNode n = doc.SelectSingleNode("//types-go-here"); foreach (XmlElement el in doc2.DocumentElement.ChildNodes) { XmlNode importedNode = doc.ImportNode(el, true); n.ParentNode.InsertBefore(importedNode, n); } n.ParentNode.RemoveChild(n); n = doc.SelectSingleNode("//filters-go-here"); foreach (var filter in factories.FilterFactory.AllRegisteredItems) { XmlElement el = doc.CreateElement("xs:element", XmlSchema.Namespace); el.SetAttribute("name", filter.Key); el.SetAttribute("type", SimpleTypeName(filter.Value)); n.ParentNode.InsertBefore(el, n); } n.ParentNode.RemoveChild(n); Console.WriteLine("Saving schema to: {0}", args[0]); doc.Save(args[0]); return 0; } } catch (Exception ex) { Console.WriteLine("ERROR: {0}", ex); return 1; } }