コード例 #1
0
ファイル: Definitions.cs プロジェクト: Tamschi/FacePuncher
        /// <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);
                }
            }
        }
コード例 #2
0
ファイル: Definitions.cs プロジェクト: Tamschi/FacePuncher
        /// <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);
                }
            }
        }