首页 / XML / xml与object 之间的ORM
xml与object 之间的ORM
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了xml与object 之间的ORM,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含4956字,纯文字阅读大概需要8分钟。
内容图文
![xml与object 之间的ORM](/upload/InfoBanner/zyjiaocheng/1190/61b7234bc6174a708a9b3084a79adf53.jpg)
xml映射为object对象,同时object对象,以xml来表示:
public class Tools { private static XmlNodeList SelectNodes(string xpath, string path) { XmlDocument doc = new XmlDocument(); doc.Load(path); return doc.SelectNodes(xpath); } privatestatic XmlNode SelectSingleNode(string xpath, string path) { XmlDocument doc = new XmlDocument(); doc.Load(path); return doc.SelectSingleNode(xpath); } publicstatic T SelectSingle<T>(string selectNode, string path) where T : IxmlToObject<T>, new() { T item = new T(); var node = SelectSingleNode(selectNode, path); if (node != null) { T obj = item.XmlToObject(node); } return item; } publicstaticvoid SaveXml(IxmlFormat obj, string path) { XmlDocument doc = new XmlDocument(); var xml = obj.ToXml(); doc.LoadXml(xml); doc.Save(path); } publicstatic List<T> SelectList<T>(string selectNode,string path) where T:new() { List<T> items = new List<T>(); var nodes = SelectNodes(selectNode,path); if (nodes != null) { var type = typeof(T); var properties = type.GetProperties().ToList(); foreach (XmlNode node in nodes) { T config = new T(); foreach (XmlAttribute a in node.Attributes) { string name = a.Name; string value = a.Value; var p = properties.FirstOrDefault(t => t.Name.ToLower() == name.ToLower()); if (p != null) { p.SetValue(config, value, null); } } items.Add(config); } } return items; } publicstaticstring ReplaceSpecialChars(string content) { if (string.IsNullOrEmpty(content)) return""; string[] specialChars = { "&", "<", ">", "\"", "‘" }; string[] entities = { "&", "<", ">", """, "'" }; int i = 0; foreach (var item in specialChars) { content = content.Replace(item, entities[i]); i++; } return content; } }
这是公共的接口:
public interface IxmlFormat { string ToXml(); } public interface IxmlToObject<T> { T XmlToObject(XmlNode node); }
下面是自定义Object对象对接口的实现:
public class TestCase : IxmlFormat, IxmlToObject<TestCase> { publicstring Title { set; get; } publicstring Author { set; get; } publicstring BibType { set; get; } ///<summary>/// 测试用例路径 ///</summary>publicstring FilePath { set; get; } public List<SearchResult> StandardResults { set; get; } public List<SearchResult> SearchResults { set; get; } publicstring ToXml() { var title = Tools.ReplaceSpecialChars(this.Title); var author = Tools.ReplaceSpecialChars(this.Author); var bibType = Tools.ReplaceSpecialChars(this.BibType); StringBuilder sb = new StringBuilder(); sb.Append("<?xml version=\"1.0\" encoding=\"utf-8\" ?>"); if (SearchResults != null && SearchResults.Count > 0) { sb.AppendFormat("<case title=\"{0}\" author=\"{1}\" bibType=\"{2}\" >", title, author, bibType); foreach (SearchResult item in SearchResults) { sb.AppendFormat("<item title=\"{0}\">", Tools.ReplaceSpecialChars(item.Title)); foreach (var fitem in item.Fields) { sb.AppendFormat("<field content=\"{0}\"/>", Tools.ReplaceSpecialChars(fitem)); } sb.AppendFormat("</item>"); } sb.Append("</case>"); } return sb.ToString(); } public TestCase XmlToObject(XmlNode node) { string title = node.Attributes["title"].Value; string author = node.Attributes["author"].Value; string bibType = node.Attributes["bibType"].Value; this.Title = title; this.Author = author; this.BibType = bibType; this.StandardResults = new List<SearchResult>(); XmlNodeList itemNodes = node.SelectNodes("//item"); foreach (XmlNode n in itemNodes) { var sr = new SearchResult() { Title = n.Attributes["title"].Value, Fields = new List<string>() }; var fileds = n.ChildNodes; foreach (XmlNode fn in fileds) { sr.Fields.Add(fn.Attributes["content"].Value); } this.StandardResults.Add(sr); } returnthis; } } publicclass SearchResult { publicstring Title { set; get; } public List<string> Fields { set; get; } }
这是一个测试用例,程序从xml文件中读取测试用例,运行测试程序,完成后把结果保存到另外一个xml文件中,这个xml文件结构和测试用例的xml结构一样。我们看看如何读取测试用例:
/// <summary> /// 读取测试用例 /// </summary> /// <returns></returns> private static List<TestCase> GetTestCase(string caseDir) { List<TestCase> tests = new List<TestCase>(); var files = Directory.GetFiles(caseDir); foreach (var f in files) { var filePath = f; var testCase = Tools.SelectSingle<TestCase>("//case", filePath); testCase.FilePath = filePath; tests.Add(testCase); } return tests; }
保存测试结果:
TestCase t = new TestCase() { FilePath = viewModel.FilePath, Author = viewModel.SearchAuthor, Title = viewModel.SearchTitle, BibType = viewModel.SearchType, SearchResults = viewModel.TestResultData, StandardResults = viewModel.StandardResults }; string path = viewModel.TestResultFilePath + "\\" + viewModel.ResolveName; if (!Directory.Exists(path)) Directory.CreateDirectory(path); path += "\\" + Path.GetFileNameWithoutExtension(t.FilePath) + "_data.xml"; Tools.SaveXml(t, path);
注意:对象与xml之间的转换,再转为xml时,注意特殊符号的转义,否则会报错。
原文:https://www.cnblogs.com/wangqiang3311/p/8990898.html
内容总结
以上是互联网集市为您收集整理的xml与object 之间的ORM全部内容,希望文章能够帮你解决xml与object 之间的ORM所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。