public GenerateSettingsWizard(IGenerator generator, List<Type> generatorTypeList) : this() { //Only show this the first time if never generated var cacheFile = new ModelCacheFile(generator); if (cacheFile.FileExists()) { this.DialogResult = DialogResult.Cancel; this.IsValid = false; return; } _generatorTypeList = generatorTypeList; //Load all wizard files var xmlFileList = Directory.GetFiles(AddinAppData.Instance.ExtensionDirectory, "genwizard.*.xml"); foreach (var fileName in xmlFileList) { this.LoadWizardFile(fileName); } if (cboItem.Items.Count == 0) { this.DialogResult = DialogResult.Cancel; this.IsValid = false; return; } cboItem.SelectedIndex = 0; }
private bool ChooseGenerators( nHydrateModel model, List <nHydrateGeneratorProject> genList, List <Type> generatorTypeList, List <Type> excludeList, nHydrate.Generator.GeneratorFramework.GeneratorHelper genHelper) { if (!genList.Any()) { MessageBox.Show("There are no generators defined", "Error", MessageBoxButtons.OK, MessageBoxIcon.Warning); return(false); } var cacheFile = new nHydrate.Generator.Common.ModelCacheFile(genList.First()); if (cacheFile.ModelerVersion > System.Reflection.Assembly.GetExecutingAssembly().GetName().Version) { if (MessageBox.Show($"This model schema was last generated with a newer modeler version ({cacheFile.ModelerVersion}). Your current version is {System.Reflection.Assembly.GetExecutingAssembly().GetName().Version}. Generating with an older modeler may cause many files to change unexpectedly. Do you wish to proceed with the generation?", "Warning", MessageBoxButtons.YesNo, MessageBoxIcon.Warning) == DialogResult.No) { return(false); } } //Initialize all the model configuration objects var modelRoot = genList.First().Model as ModelRoot; modelRoot.ModelConfigurations = new Dictionary <string, IModelConfiguration>(); foreach (var genType in generatorTypeList) { var generator = genHelper.GetProjectGenerator(genType); modelRoot.ModelConfigurations.Add(generator.GetType().Name, generator.ModelConfiguration); } //Show generator list using (var F = new GenerateSettings(genList.First(), generatorTypeList, null)) { if (F.ShowDialog() != DialogResult.OK) { return(false); } excludeList.AddRange(F.ExcludeList); } return(true); }
public GenerateSettings(IGenerator generator, List<Type> generatorTypeList, List<Type> wizardTypeList, List<string> moduleList) : this() { try { _generator = generator; _moduleList = moduleList; _generatorTypeList = generatorTypeList; _wizardTypeList = wizardTypeList; var globalCacheFile = new GlobalCacheFile(); var cacheFile = new ModelCacheFile(_generator); foreach (var v in generatorTypeList) { var attribute = v.GetCustomAttributes(typeof(GeneratorProjectAttribute), true).Cast<GeneratorProjectAttribute>().FirstOrDefault(); if (!globalCacheFile.ExcludeList.Contains(v.FullName)) { _generatorMap.Add(attribute.Name, v); } } LoadGenerators(true); //Add modules foreach (var s in moduleList.OrderBy(x => x)) { chkModule.Items.Add(s); if (cacheFile.GeneratedModuleList.Count(x => x.ToLower() == s.ToLower()) > 0) chkModule.SetItemChecked(chkModule.Items.Count - 1, true); } if (moduleList.Count == 0) { wizard1.WizardPages.Remove(pageModules); } wizard1.FinishEnabled = (moduleList.Count == 0); } catch (Exception ex) { throw; } }
private void PerformGeneration( nHydrateModel model, List <nHydrateGeneratorProject> genList, Microsoft.VisualStudio.Modeling.Store store, Microsoft.VisualStudio.Modeling.Shell.ModelingDocData docData, List <Type> excludeList, nHydrate.Generator.GeneratorFramework.GeneratorHelper genHelper) { _totalFileCount = 0; _processedFileCount = 0; var pkey = string.Empty; try { var startTime = DateTime.Now; var isLicenseError = false; try { //Get the last version we generated on this machine //We will use this to determine if any other generations have been performed on other machines var cacheFile = new nHydrate.Generator.Common.ModelCacheFile(genList.First()); var cachedGeneratedVersion = cacheFile.GeneratedVersion; var generatedVersion = cachedGeneratedVersion + 1; pkey = ProgressHelper.ProgressingStarted("Generating...", false, 240000); //Put a 4 minute timer on it foreach (var generator in genList) { var modelRoot = (generator.Model as nHydrate.Generator.Common.Models.ModelRoot); modelRoot.GeneratedVersion = generatedVersion; _totalFileCount += genHelper.GetFileCount(generator, excludeList); } System.Diagnostics.Debug.WriteLine($"File count: {_totalFileCount}"); //Save document var isDirty = 0; docData.IsDirty(out isDirty); if (model.IsDirty || (isDirty != 0)) { (docData as nHydrateDocData).Save(docData.FileName, 1, 0); } _startTime = DateTime.Now; foreach (var item in genList) { genHelper.GenerateAll(item, excludeList); } var modelKey = (genList.FirstOrDefault()?.Model as nHydrate.Generator.Common.Models.ModelRoot)?.Key; //Save model statistics var eCount = model.Entities.Count; var fCount = model.Entities.SelectMany(x => x.FieldList).Count(); ModelStatsFile.Log(modelKey, eCount, fCount); //Save local copy of last generated version cacheFile.GeneratedVersion = generatedVersion; cacheFile.ModelerVersion = System.Reflection.Assembly.GetExecutingAssembly().GetName().Version; cacheFile.Save(); this.ErrorList = genHelper.GetErrorList().ToList(); } catch (nHydrate.Generator.Common.Exceptions.LicenseException ex) { ProgressHelper.ProgressingComplete(pkey); MessageBox.Show("This product is not properly licensed.", "License Error", MessageBoxButtons.OK, MessageBoxIcon.Warning); isLicenseError = true; } catch (Exception ex) { throw; } finally { ProgressHelper.ProgressingComplete(pkey); } var endTime = DateTime.Now; var duration = endTime.Subtract(startTime); #region Show Generation Complete Dialog if (!isLicenseError) { using (var F = new StatisticsForm()) { var text = "The generation was successful.\r\n\r\n"; text += "Files generated: " + this.FilesSuccess + "\r\n"; text += "Files skipped: " + this.FilesSkipped + "\r\n"; text += "Files failed: " + this.FilesFailed + "\r\n"; text += "\r\n\r\n"; text += "Generation time: " + duration.Hours.ToString("00") + ":" + duration.Minutes.ToString("00") + ":" + duration.Seconds.ToString("00"); F.DisplayText = text; F.GeneratedFileList = this.GeneratedFileList; F.ShowDialog(); } } #endregion } catch (Exception ex) { ProgressHelper.ProgressingComplete(pkey); GlobalHelper.ShowError(ex); } }
/* * --model=C:\code\nHydrateTestAug\ConsoleApp1\Model1.nhydrate --output=C:\code\nHydrateTestAug --generators=nHydrate.Generator.EFCodeFirstNetCore.EFCodeFirstNetCoreProjectGenerator,nHydrate.Generator.PostgresInstaller.PostgresDatabaseProjectGenerator,nHydrate.Generator.SQLInstaller.Core.DatabaseProjectGenerator */ static int Main(string[] args) { IConfiguration Configuration = new ConfigurationBuilder() .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true) .AddJsonFile("appsettings.development.json", optional: true, reloadOnChange: true) .AddCommandLine(args) .Build(); var modelFile = string.Empty; var output = string.Empty; var generators = new string[0]; //AppSettings var allValues = Configuration.GetChildren().Select(x => new { x.Key, x.Value }).ToDictionary(x => x.Key.ToString(), x => x.Value?.ToString()); if (allValues.ContainsKey(ModelKey)) { modelFile = allValues[ModelKey]; } if (allValues.ContainsKey(OutputKey)) { output = allValues[OutputKey]; } if (allValues.ContainsKey(GeneratorsKey)) { generators = allValues[GeneratorsKey].Split(",", StringSplitOptions.RemoveEmptyEntries); } if (modelFile.IsEmpty()) { return(ShowError("The model is required.")); } if (output.IsEmpty()) { return(ShowError("The output folder is required.")); } //If there are no generators specified on the command line then check for the file "nhydrate.generators" if (!generators.Any()) { var folderName = (new FileInfo(modelFile)).DirectoryName; var genDefFile = Path.Combine(folderName, "nhydrate.generators"); if (File.Exists(genDefFile)) { generators = File.ReadAllLines(genDefFile).Where(x => x.Trim() != string.Empty).ToArray(); } if (!generators.Any()) { return(ShowError("The generators are required.")); } } Console.WriteLine($"modelFile='{modelFile}'"); Console.WriteLine($"output='{output}'"); Console.WriteLine($"generators='{string.Join(",", generators)}'"); //NOTE: Yaml Model files must end with ".nhydrate.yaml" //Old Xml file ends with ".nhydrate" //Specified a folder so look for the file string actualFile = null; if (Directory.Exists(modelFile)) { var folderName = modelFile; //Look for new Yaml file var f = Directory.GetFiles(folderName, "*" + FileManagement.ModelExtension).FirstOrDefault(); if (File.Exists(f)) { actualFile = f; } //Look for old xml file if (actualFile.IsEmpty()) { f = Directory.GetFiles(folderName, "*" + FileManagement.OldModelExtension).FirstOrDefault(); if (File.Exists(f)) { actualFile = f; } } if (actualFile.IsEmpty()) { //Back 1 folder folderName = (new DirectoryInfo(folderName)).Parent.FullName; f = Directory.GetFiles(folderName, "*" + FileManagement.ModelExtension).FirstOrDefault(); if (File.Exists(f)) { actualFile = f; } //Look for old xml file if (actualFile.IsEmpty()) { f = Directory.GetFiles(folderName, "*" + FileManagement.OldModelExtension).FirstOrDefault(); if (File.Exists(f)) { actualFile = f; } } } } else { //Is this the Yaml model? if (modelFile.EndsWith(FileManagement.ModelExtension)) { actualFile = modelFile; } //Is this the Xml model? if (modelFile.EndsWith(FileManagement.OldModelExtension)) { actualFile = modelFile; } //Look one folder back for Yaml if (actualFile.IsEmpty()) { var folderName = (new FileInfo(modelFile)).Directory.Parent.FullName; var f = Directory.GetFiles(folderName, "*" + FileManagement.ModelExtension).FirstOrDefault(); if (File.Exists(f)) { actualFile = f; } } } if (actualFile.IsEmpty()) { return(ShowError("Model file not found.")); } modelFile = actualFile; var timer = System.Diagnostics.Stopwatch.StartNew(); var formatModel = (allValues.ContainsKey("formatmodel") && allValues["formatmodel"] == "true"); //TODO: when model files missing ID, it generates all fields as first one nHydrate.Generator.Common.Models.ModelRoot model = null; try { Console.WriteLine(); Console.WriteLine("Loading model..."); model = ModelHelper.CreatePOCOModel(modelFile, formatModel); } catch (ModelException ex) { //All YAML validation errors will come here Console.WriteLine(ex.Message); return(1); } catch (Exception ex) { Console.WriteLine("Unknown error."); return(1); } //Generate if (model != null && !formatModel) { Console.WriteLine("Loading generators..."); var genHelper = new nHydrate.Command.Core.GeneratorHelper(output); genHelper.ProjectItemGenerated += new nHydrate.Generator.Common.GeneratorFramework.ProjectItemGeneratedEventHandler(g_ProjectItemGenerated); var genList = new List <nHydrateGeneratorProject>(); var genProject = new nHydrateGeneratorProject(); genList.Add(genProject); model.ResetKey(model.Key); model.GeneratorProject = genProject; genProject.Model = model; genProject.FileName = $"{modelFile}.generating"; var document = new System.Xml.XmlDocument(); document.LoadXml($"<modelRoot guid=\"{model.Key}\" type=\"nHydrate.Generator.nHydrateGeneratorProject\" assembly=\"nHydrate.Generator.dll\"><ModelRoot></ModelRoot></modelRoot>"); ((nHydrate.Generator.Common.GeneratorFramework.IXMLable)model).XmlAppend(document.DocumentElement.ChildNodes[0]); System.IO.File.WriteAllText(genProject.FileName, document.ToIndentedString()); var allgenerators = genHelper.GetProjectGenerators(genProject); var excludeList = allgenerators.Where(x => !generators.Contains(x.FullName)).ToList(); //Get the last version we generated on this machine //We will use this to determine if any other generations have been performed on other machines var cacheFile = new nHydrate.Generator.Common.ModelCacheFile(genList.First()); var cachedGeneratedVersion = cacheFile.GeneratedVersion; var generatedVersion = cachedGeneratedVersion + 1; model.GeneratedVersion = generatedVersion; Console.WriteLine($"Generating code..."); foreach (var item in genList) { genHelper.GenerateAll(item, excludeList); } //Save local copy of last generated version cacheFile.GeneratedVersion = generatedVersion; cacheFile.ModelerVersion = System.Reflection.Assembly.GetExecutingAssembly().GetName().Version; cacheFile.Save(); if (File.Exists(genProject.FileName)) { File.Delete(genProject.FileName); } //Write stats Console.WriteLine(); Console.WriteLine("Generation Summary"); Console.WriteLine($"Total Files: {_stats.ProcessedFileCount}"); Console.WriteLine($"Files Success: {_stats.FilesSuccess}"); Console.WriteLine($"Files Skipped: {_stats.FilesSkipped}"); Console.WriteLine($"Files Failed: {_stats.FilesFailed}"); Console.WriteLine(); } else if (!formatModel) { Console.WriteLine("The model could not be loaded."); } timer.Stop(); Console.WriteLine($"Generation complete. Elapsed={timer.ElapsedMilliseconds}ms"); return(0); }
private void wizard1_Finish(object sender, EventArgs e) { if (chkModule.Items.Count > 0) { if (chkModule.CheckedItems.Count == 0) { MessageBox.Show("You must select one or more modules for generation.", "Check Modules", MessageBoxButtons.OK, MessageBoxIcon.Information); return; } } var cacheFile = new ModelCacheFile(_generator); cacheFile.ExcludeList.Clear(); foreach (var t in this.ExcludeList) { cacheFile.ExcludeList.Add(t.FullName); } cacheFile.GeneratedModuleList.Clear(); foreach (string s in chkModule.CheckedItems) { cacheFile.GeneratedModuleList.Add(s); } cacheFile.Save(); this.DialogResult = DialogResult.OK; this.Close(); }
public TableCodeFacadeUpdateForm(TableCollection tableCollection, FieldSettingConstants fieldSetting) : this() { _tableCollection = tableCollection; _fieldSetting = fieldSetting; if (_fieldSetting == FieldSettingConstants.Name) { this.Text = "Update Entity"; } else if (_fieldSetting == FieldSettingConstants.CodeFacade) { this.Text = "Update CodeFacade"; cmdRemoveAll.Visible = true; } try { var cacheFile = new ModelCacheFile(((ModelRoot)tableCollection.Root).GeneratorProject); if (!string.IsNullOrEmpty(cacheFile.TableFacadeSettings)) { var document = new XmlDocument(); document.LoadXml(cacheFile.TableFacadeSettings); var containerNode = document.DocumentElement.ChildNodes[0]; optPrefix.Checked = XmlHelper.GetAttributeValue(containerNode, "prefixChecked", optPrefix.Checked); txtPrefix.Text = XmlHelper.GetAttributeValue(containerNode, "prefix", txtPrefix.Text); chkReplaceText.Checked = XmlHelper.GetAttributeValue(containerNode, "replaceText", chkReplaceText.Checked); txtReplaceSource.Text = XmlHelper.GetAttributeValue(containerNode, "replaceSource", txtReplaceSource.Text); txtReplaceTarget.Text = XmlHelper.GetAttributeValue(containerNode, "replaceTarget", txtReplaceTarget.Text); optUpcase.Checked = XmlHelper.GetAttributeValue(containerNode, "upcase", optUpcase.Checked); optUnderscore.Checked = XmlHelper.GetAttributeValue(containerNode, "underscore", optUnderscore.Checked); chkSkip2Caps.Checked = XmlHelper.GetAttributeValue(containerNode, "TwoCaps", chkSkip2Caps.Checked); } } catch (Exception ex) { throw; } this.UpdateForm(); }
private void LoadGenerators(bool isMain) { try { var globalCacheFile = new GlobalCacheFile(); var cacheFile = new ModelCacheFile(_generator); tvwProjects.Nodes.Clear(); foreach (var key in _generatorMap.Keys) { var sysType = _generatorMap[key]; if (!globalCacheFile.ExcludeList.Contains(sysType.FullName)) { var attribute = sysType.GetCustomAttributes(typeof(GeneratorProjectAttribute), true).Cast<GeneratorProjectAttribute>().FirstOrDefault(); if ((isMain && attribute.IsMain) || !isMain) { var typeName = string.Empty; if (attribute.CurrentType != null) typeName = attribute.CurrentType.ToString(); var node = tvwProjects.Nodes.Add(typeName, attribute.Name); node.Tag = attribute; if (_wizardTypeList != null) { node.Checked = _wizardTypeList.Contains(sysType); } else { node.Checked = !cacheFile.ExcludeList.Contains(sysType.FullName); } } } } } catch (Exception ex) { throw; } }
private void SaveSettings() { //Save settings var cacheFile = new ModelCacheFile(((ModelRoot)_tableCollection.Root).GeneratorProject); var document = new XmlDocument(); document.LoadXml("<a><z></z></a>"); var containerNode = document.DocumentElement.ChildNodes[0]; XmlHelper.AddAttribute(containerNode, "prefixChecked", optPrefix.Checked); XmlHelper.AddAttribute(containerNode, "prefix", txtPrefix.Text); XmlHelper.AddAttribute(containerNode, "replaceText", chkReplaceText.Checked); XmlHelper.AddAttribute(containerNode, "replaceSource", txtReplaceSource.Text); XmlHelper.AddAttribute(containerNode, "replaceTarget", txtReplaceTarget.Text); XmlHelper.AddAttribute(containerNode, "upcase", optUpcase.Checked); XmlHelper.AddAttribute(containerNode, "underscore", optUnderscore.Checked); XmlHelper.AddAttribute(containerNode, "TwoCaps", chkSkip2Caps.Checked); cacheFile.TableFacadeSettings = document.OuterXml; cacheFile.Save(); }
public ColumnCodeFacadeUpdateForm(ReferenceCollection columnCollection, ModelRoot modelRoot, FieldSettingConstants fieldSetting) : this() { _columnCollection = columnCollection; _modelRoot = modelRoot; _fieldSetting = fieldSetting; if (_fieldSetting == FieldSettingConstants.Name) { this.Text = "Update Field"; } else if (_fieldSetting == FieldSettingConstants.Name) { this.Text = "Update CodeFacade"; } try { ModelCacheFile cacheFile = null; if (modelRoot != null) cacheFile = new ModelCacheFile(modelRoot.GeneratorProject); else cacheFile = new ModelCacheFile(((ModelRoot)columnCollection.Root).GeneratorProject); if (!string.IsNullOrEmpty(cacheFile.CodeFacadeSettings)) { var document = new XmlDocument(); document.LoadXml(cacheFile.CodeFacadeSettings); var containerNode = document.DocumentElement.ChildNodes[0]; optPrefix.Checked = XmlHelper.GetAttributeValue(containerNode, "prefixChecked", optPrefix.Checked); txtPrefix.Text = XmlHelper.GetAttributeValue(containerNode, "prefix", txtPrefix.Text); chkReplaceText.Checked = XmlHelper.GetAttributeValue(containerNode, "replaceText", chkReplaceText.Checked); txtReplaceSource.Text = XmlHelper.GetAttributeValue(containerNode, "replaceSource", txtReplaceSource.Text); txtReplaceTarget.Text = XmlHelper.GetAttributeValue(containerNode, "replaceTarget", txtReplaceTarget.Text); optUpcase.Checked = XmlHelper.GetAttributeValue(containerNode, "upcase", optUpcase.Checked); optUnderscore.Checked = XmlHelper.GetAttributeValue(containerNode, "underscore", optUnderscore.Checked); chkSkip2Caps.Checked = XmlHelper.GetAttributeValue(containerNode, "TwoCaps", chkSkip2Caps.Checked); } } catch (Exception ex) { throw; } this.UpdateForm(); }
private void cmdOK_Click(object sender, EventArgs e) { pnlProgress.Location = pnlMain.Location; pnlMain.Visible = false; pnlProgress.Visible = true; cmdOK.Enabled = false; cmdCancel.Enabled = false; if (_modelRoot != null) { var index = 0; foreach (Table t in _modelRoot.Database.Tables) { this.ProcessColumnCollection(t.Columns); this.progressBar1.Value = (int)((index * 100.0) / _modelRoot.Database.Tables.Count); System.Windows.Forms.Application.DoEvents(); index++; } } else if (_columnCollection != null) { this.ProcessColumnCollection(_columnCollection); } //Save settings ModelCacheFile cacheFile = null; if (_modelRoot != null) cacheFile = new ModelCacheFile(_modelRoot.GeneratorProject); else cacheFile = new ModelCacheFile(((ModelRoot)_columnCollection.Root).GeneratorProject); var document = new XmlDocument(); document.LoadXml("<a><z></z></a>"); var containerNode = document.DocumentElement.ChildNodes[0]; XmlHelper.AddAttribute(containerNode, "prefixChecked", optPrefix.Checked); XmlHelper.AddAttribute(containerNode, "prefix", txtPrefix.Text); XmlHelper.AddAttribute(containerNode, "replaceText", chkReplaceText.Checked); XmlHelper.AddAttribute(containerNode, "replaceSource", txtReplaceSource.Text); XmlHelper.AddAttribute(containerNode, "replaceTarget", txtReplaceTarget.Text); XmlHelper.AddAttribute(containerNode, "upcase", optUpcase.Checked); XmlHelper.AddAttribute(containerNode, "underscore", optUnderscore.Checked); XmlHelper.AddAttribute(containerNode, "TwoCaps", chkSkip2Caps.Checked); cacheFile.CodeFacadeSettings = document.OuterXml; cacheFile.Save(); this.DialogResult = DialogResult.OK; this.Close(); }
public TableCodeFacadeUpdateForm(nHydrate.Dsl.nHydrateModel model) : this() { _model = model; try { var cacheFile = new ModelCacheFile(_model.ModelFileName); if (!string.IsNullOrEmpty(cacheFile.TableFacadeSettings)) { var document = new XmlDocument(); document.LoadXml(cacheFile.TableFacadeSettings); var containerNode = document.DocumentElement.ChildNodes[0]; optPrefix.Checked = XmlHelper.GetAttributeValue(containerNode, "prefixChecked", optPrefix.Checked); txtPrefix.Text = XmlHelper.GetAttributeValue(containerNode, "prefix", txtPrefix.Text); chkReplaceText.Checked = XmlHelper.GetAttributeValue(containerNode, "replaceText", chkReplaceText.Checked); txtReplaceSource.Text = XmlHelper.GetAttributeValue(containerNode, "replaceSource", txtReplaceSource.Text); txtReplaceTarget.Text = XmlHelper.GetAttributeValue(containerNode, "replaceTarget", txtReplaceTarget.Text); cboCasing.SelectedIndex = XmlHelper.GetAttributeValue(containerNode, "casing", cboCasing.SelectedIndex); } //Entities foreach (var item in model.Entities) { var newItem = new ListViewItem { Text = item.Name, ImageIndex = 0, Checked = true, Tag = new DataItem { Element = item, } }; newItem.SubItems.Add(item.CodeFacade); newItem.SubItems.Add("Entity"); lvwItem.Items.Add(newItem); } //Views foreach (var item in model.Views) { var newItem = new ListViewItem { Text = item.Name, ImageIndex = 1, Checked = true, Tag = new DataItem { Element = item, } }; newItem.SubItems.Add(item.CodeFacade); newItem.SubItems.Add("View"); lvwItem.Items.Add(newItem); } //Stored Procedures foreach (var item in model.StoredProcedures) { var newItem = new ListViewItem { Text = item.Name, ImageIndex = 2, Checked = true, Tag = new DataItem { Element = item, } }; newItem.SubItems.Add(item.CodeFacade); newItem.SubItems.Add("Stored Procedure"); lvwItem.Items.Add(newItem); } //Functions foreach (var item in model.Functions) { var newItem = new ListViewItem { Text = item.Name, ImageIndex = 3, Checked = true, Tag = new DataItem { Element = item, } }; newItem.SubItems.Add(item.CodeFacade); newItem.SubItems.Add("Function"); lvwItem.Items.Add(newItem); } } catch (Exception ex) { throw; } this.UpdateForm(); }
private void SaveSettings() { //Save settings var cacheFile = new ModelCacheFile(_model.ModelFileName); var document = new XmlDocument(); document.LoadXml("<a><z></z></a>"); var containerNode = document.DocumentElement.ChildNodes[0]; XmlHelper.AddAttribute(containerNode, "prefixChecked", optPrefix.Checked); XmlHelper.AddAttribute(containerNode, "prefix", txtPrefix.Text); XmlHelper.AddAttribute(containerNode, "replaceText", chkReplaceText.Checked); XmlHelper.AddAttribute(containerNode, "replaceSource", txtReplaceSource.Text); XmlHelper.AddAttribute(containerNode, "replaceTarget", txtReplaceTarget.Text); XmlHelper.AddAttribute(containerNode, "casing", cboCasing.SelectedIndex); cacheFile.TableFacadeSettings = document.OuterXml; cacheFile.Save(); }