/// <summary> /// Loads all definition files found in the specified directory, /// and optionally in all sub-directories too. /// </summary> /// <param name="path">Path to the directory.</param> /// <param name="ns">Namespace filter for definitions.</param> /// <param name="recursive">If true, will recurse into sub-directories.</param> public static void LoadFromDirectory(String path, DefinitionsNamespace ns, bool recursive = true) { foreach (var file in Directory.GetFiles(path)) { if (Path.GetExtension(file) != ".xml") continue; LoadFromFile(file, ns); } if (recursive) { foreach (var dir in Directory.GetDirectories(path)) { LoadFromDirectory(dir, ns, recursive); } } }
/// <summary> /// Loads all definitions found in a single XML file. /// </summary> /// <param name="path"></param> /// <param name="ns"></param> public static void LoadFromFile(String path, DefinitionsNamespace ns) { XNamespace server = "/server"; XNamespace client = "/client"; // Wrap a root object and namespace definitions around the document. var xml = String.Format("<definitions xmlns:server=\"{0}\" " + "xmlns:client=\"{1}\">{2}{3}{2}</definitions>", server, client, Environment.NewLine, File.ReadAllText(path)); XDocument doc; using (var stream = new MemoryStream(System.Text.Encoding.Unicode.GetBytes(xml))) { // Some weird characters may be used as entity symbols, so // don't check characters. var settings = new XmlReaderSettings { CheckCharacters = false }; using (var reader = XmlReader.Create(stream, settings)) { reader.MoveToContent(); doc = XDocument.Load(reader); } } var definitions = doc.Element("definitions"); if (!ns.HasFlag(DefinitionsNamespace.Server)) { PurgeNamespace(definitions, server); } if (!ns.HasFlag(DefinitionsNamespace.Client)) { PurgeNamespace(definitions, client); } foreach (var elem in definitions.Elements()) { var name = elem.Name.LocalName; if (_typeHandlers.ContainsKey(name)) { _typeHandlers[name](elem); } else { if (!_unhandled.ContainsKey(name)) { _unhandled.Add(name, new List<XElement>()); } _unhandled[name].Add(elem); } } }