自己动手设计代码编辑器——(六)自己写XML管理类
2013-07-07 23:45
615 查看
由于C# XML的管理类没怎么看明白,自己写了实用。
首先是节点UDataElement,是XML数据中的一个节点
节点又可以包含节点。嵌套的包含。
还可以添加子节点
接下来是文档分析类,作用是分析XML文档(自己定义的格式)
接下来是XML文档 UDataDocument,可以保存,载入文档。。。
自定义XML格式如下
这样的格式。。。
首先是节点UDataElement,是XML数据中的一个节点
节点又可以包含节点。嵌套的包含。
还可以添加子节点
public class UDataElement { public List<UDataElement> Items { get; protected set; } public bool HasItem { get { return Items.Count != 0; } } public string Name { get; set; } public string Value { get; set; } public UDataElement() { this.Items = new List<UDataElement>(); this.Name = string.Empty; this.Value = string.Empty; } public virtual void SetData(string name, string value) { foreach (UDataElement element in Items) { if (element.Name == name) { element.Value = value; } } } public virtual void AddData(string name, string value) { UDataElement ue = new UDataElement(); ue.Name = name; ue.Value = value; Items.Add(ue); }
接下来是文档分析类,作用是分析XML文档(自己定义的格式)
public class UDataParser { private List<string> mData; private int mRow; private int mCol; private int mOldRow; private int mOldCol; private int mSaveRow; private int mSaveCol; private int mSaveOldRow; private int mSaveOldCol; private bool mEndOfData; public UDataParser() { this.mData = new List<string>(); this.mRow = 0; this.mCol = 0; this.mOldRow = 0; this.mOldCol = 0; this.mEndOfData = false; } public void Load(string filePath) { try { StreamReader fp = new StreamReader(filePath, Encoding.Default); string line = string.Empty; while (!fp.EndOfStream) { line = fp.ReadLine(); if (line == string.Empty) { continue; } mData.Add(line); } fp.Close(); fp.Dispose(); } catch (Exception ex) { throw ex; } } public string GetNextData() { StringBuilder result = new StringBuilder(); bool inString = false; while (!mEndOfData) { char ch = GetNextChar(); if (ch == (char)0) { break; } switch (ch) { case '<': case '>': case '[': case ']': case ' ': case '=': case '/': if (inString) { result.Append(ch); } else { if (result.Length == 0) { return ch.ToString(); } else { BackToLast(); if (result[0] == '"') { result.Remove(0, 1); } if (result[result.Length - 1] == '"') { result.Remove(result.Length - 1, 1); } return result.ToString(); } } break; case '\t': break; case '\n': break; case '"': inString = !inString; result.Append(ch); break; case '\\': result.Append(GetNextChar()); break; default: result.Append(ch); break; } } return result.ToString(); } public string GetNextData(string data) { string str = GetNextData(); if (str == data) { return str; } throw new Exception("Unexpect " + data); } public string PeekNextData() { int col = mCol; int row = mRow; int oldCol = mOldCol; int oldRow = mOldRow; string data = GetNextData(); mCol = col; mRow = row; mOldCol = oldCol; mOldRow = oldRow; return data; } public void Save() { mSaveCol = mCol; mSaveRow = mRow; mSaveOldCol = mOldCol; mSaveOldRow = mOldRow; } public void Load() { mCol = mSaveCol; mRow = mSaveRow; mOldCol = mSaveOldCol; mOldRow = mSaveOldRow; } private char GetNextChar() { if (mEndOfData) { return (char)0; } mOldCol = mCol; mOldRow = mRow; if (mRow >= mData.Count) { mEndOfData = true; return (char)0; } if (mCol >= mData[mRow].Length) { mCol = 0; mRow++; if (mRow >= mData.Count) { mEndOfData = true; return (char)0; } } return mData[mRow][mCol++]; } private void BackToLast() { mCol = mOldCol; mRow = mOldRow; } }
接下来是XML文档 UDataDocument,可以保存,载入文档。。。
public class UDataDocument : UDataElement { private UDataParser mParser; public UDataDocument() { this.mParser = new UDataParser(); } public void Load(string filePath) { mParser.Load(filePath); UDataElement Environment = ParseElement(); UDataElement Editor = ParseElement(); UDataElement Language = ParseElement(); Items.Add(Environment); Items.Add(Editor); Items.Add(Language); } public void Save(string filePath) { try { StreamWriter fp = new StreamWriter(filePath, false, Encoding.Default); SaveElement(fp, this, 0); fp.Close(); fp.Dispose(); } catch (Exception ex) { throw ex; } } private UDataElement ParseElement() { try { UDataElement element = new UDataElement(); mParser.GetNextData("["); element.Name = mParser.GetNextData(); element.Value = string.Empty; mParser.GetNextData("]"); while (true) { string nextData = mParser.PeekNextData(); switch (nextData) { case "<": { UDataElement de = new UDataElement(); mParser.GetNextData("<"); mParser.GetNextData("Name"); mParser.GetNextData("="); de.Name = mParser.GetNextData(); mParser.GetNextData(" "); mParser.GetNextData("Value"); mParser.GetNextData("="); de.Value = mParser.GetNextData(); mParser.GetNextData(">"); element.Items.Add(de); } break; case "[": mParser.Save(); mParser.GetNextData("["); if (mParser.PeekNextData() == "/") { mParser.GetNextData("/"); mParser.GetNextData(element.Name); mParser.GetNextData("]"); return element; } else { mParser.Load(); element.Items.Add(ParseElement()); } break; default: break; } } } catch (Exception ex) { throw ex; } } private void SaveElement(StreamWriter fp, UDataElement element, int tab) { try { foreach (UDataElement ue in element.Items) { for (int i = 0; i < tab; i++) { fp.Write('\t'); } if (ue.HasItem) { fp.WriteLine("[" + ue.Name + "]"); SaveElement(fp, ue, tab + 1); for (int i = 0; i < tab; i++) { fp.Write('\t'); } fp.WriteLine("[/" + ue.Name + "]"); fp.WriteLine(); } else { fp.WriteLine("<Name=\"" + ue.Name + "\" Value=\"" + ue.Value + "\">"); } } } catch (Exception ex) { throw ex; } } }
自定义XML格式如下
[Environment] <Name="ExitAutoSave" Value="false"> [/Environment] [Editor] <Name="Tab" Value="9"> <Name="NewLine" Value="10"> <Name="Enter" Value="13"> <Name="Space" Value="32"> <Name="DoubleQuote" Value="34"> <Name="Quote" Value="39"> <Name="BackSlash" Value="47"> <Name="Slash" Value="92"> <Name="LBracket" Value="123"> <Name="RBracket" Value="125"> <Name="TabNumberOfSpace" Value="4"> [/Editor] [Language] [C#] <Name="ClassString" Value="class"> [/C#] [/Language]
这样的格式。。。
相关文章推荐
- 自己动手设计代码编辑器——(一)源代代码分析
- 自己动手设计代码编辑器——(二)导入源代码
- 自己动手设计代码编辑器——(四)代码智能提示(自动完成功能)
- 自己动手设计代码编辑器——(三)撤销与重做
- 自己动手设计代码编辑器——(五)分析源代码
- 自己动手,结合javascript和dhtml做一个ubb编辑器(附例子代码)
- 自己动手修改Robotium代码
- 自己动手设计 PHP MVC 框架(一)——URL
- 自己动手设计 PHP MVC 框架(一)——URL (转载)
- winform不能用窗体设计器打开,只能用代码编辑器打开
- 自己动手实现jQuery Callbacks完整功能代码详解
- 编程精粹--编写高质量C语言代码(3):自己设计并使用断言(二)
- 原创:xml 验证 教程 schema 编辑器/设计器
- 自己动手弄基于QT5和directx11的简单粒子编辑器v0.1(一个编辑器,一个更新器,一个linux服务端程序)
- 自己动手设计ESB(1)
- 自己动手设计ESB(2)
- 自己动手设计ESB(3)
- 自己动手设计ESB(5)
- 自己动手实现权限控制(数据库表的设计)
- 《自己动手建搜索引擎》日志分析类代码解析与修正为兼容lucene3.0.2