//Открывает XML файл и создает структуру из содержимого public bool LoadStructureFromFile() { TagRoot = new TagItem("Root", null, null); StreamReader reader; try { reader = new StreamReader(filepath); } catch { return(false); } Regex tagRegEx = new Regex("(<tag[^>]*>|</tag>)"); Regex nameRegEx = new Regex("(?<=name=\")\\w+(?=\")"); Regex valueRegEx = new Regex("(?<=value=\")((\\d+(,\\d+)?)|True|False|None)(?=\")"); Regex typeRegEx = new Regex("(?<=type=\")(None|Bool|Int|Double)(?=\")"); //Добавление новых элементов происходит относительно этого указателся TagItem cursor = Root; //Находим все открывающие и закрывающие теги и рассматриваем их по порядку foreach (Match hit in tagRegEx.Matches(reader.ReadToEnd())) { //Если тег закрывающий то это значит мы закончили добавлять детей в элемент структуры, на который ссылается указатель //указателем становится родитель этого элемета(движение вверх по дереву) if (hit.Value == "</tag>") { cursor = cursor.Parent; } //Обрабатываем все теги кроме тега Root else if (hit.Value != "<tag name=\"Root\" type=\"None\">") { //Верезаем значения из открывающего тега string name = nameRegEx.Match(hit.Value).Value; string value = valueRegEx.Match(hit.Value).Value; string type = typeRegEx.Match(hit.Value).Value; //В зависимости от типа добавляем новый элемент //и указатель ссылается на этот элемент switch (type) { case "None": cursor = cursor.AddChild(name, null); break; case "Bool": cursor = cursor.AddChild(name, bool.Parse(value)); break; case "Int": cursor = cursor.AddChild(name, int.Parse(value)); break; case "Double": cursor = cursor.AddChild(name, double.Parse(value)); break; default: throw new Exception("Неизвестный тип"); } } } reader.Close(); return(true); }
static private void AddTagFormAddNone(MenuForm menu) { bufferItem.AddChild(bufferName, null); Controller.ChangeForm("Main"); Controller.Form.Confirm = string.Format("Элемент '{0}' добавлен в структуру", bufferName); }