xml与object 之间的ORM
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);
}
private static XmlNode SelectSingleNode(string xpath, string path)
{
XmlDocument doc = new XmlDocument();
doc.Load(path);
return doc.SelectSingleNode(xpath);
} public static 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;
}
public static void SaveXml(IxmlFormat obj, string path)
{
XmlDocument doc = new XmlDocument();
var xml = obj.ToXml();
doc.LoadXml(xml);
doc.Save(path);
} public static 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;
} public static string ReplaceSpecialChars(string content)
{
if (string.IsNullOrEmpty(content)) return ""; string[] specialChars = { "&", "<", ">", "\"", "'" };
string[] entities = { "&", "<", ">", """, "'" }; int i = ;
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>
{
public string Title { set; get; }
public string Author { set; get; }
public string BibType { set; get; }
/// <summary>
/// 测试用例路径
/// </summary>
public string FilePath { set; get; } public List<SearchResult> StandardResults { set; get; } public List<SearchResult> SearchResults { set; get; } public string 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 > )
{
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);
} return this;
}
} public class SearchResult
{
public string 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时,注意特殊符号的转义,否则会报错。
xml与object 之间的ORM的更多相关文章
- Spring Framework------>version4.3.5.RELAESE----->Reference Documentation学习心得----->使用spring framework的IoC容器功能----->方法一:使用XML文件定义beans之间的依赖注入关系
XML-based configuration metadata(使用XML文件定义beans之间的依赖注入关系) 第一部分 编程思路概述 step1,在XML文件中定义各个bean之间的依赖关系. ...
- Django中ORM介绍和字段及字段参数 Object Relational Mapping(ORM)
Django中ORM介绍和字段及字段参数 Object Relational Mapping(ORM) ORM介绍 ORM概念 对象关系映射(Object Relational Mapping,简 ...
- Object Relational Mapping(ORM)
Object Relational Mapping(ORM) ORM介绍 ORM概念 对象关系映射(Object Relational Mapping,简称ORM)模式是一种为了解决面向对象与关系数据 ...
- RCE via XStream object deserialization && SECURITY-247 / CVE-2016-0792 XML reconstruction Object Code Inject
catalogue . Java xStream . DynamicProxyConverter . java.beans.EventHandler . RCE via XStream object ...
- JAXB 操作XML 与 Object
Java Architecture for XML Binding) 是一个业界的标准,是一项能够依据XML Schema产生Java类的技术.是一种xml与object映射绑定技术标准. JDK5下 ...
- php中 xml json 数组 之间相互转换
php中 xml json 数组 之间相互转换 1 数组转json $result = array( 'status' =>$status, 'message'=>$message, ' ...
- applicationContext.xml报错org.springframework.orm.hibernate3.LocalSessionFactoryBean not found
applicationContext.xml报错org.springframework.orm.hibernate3.LocalSessionFactoryBean not found 解决办法: 1 ...
- java中Xml、json之间的相互转换
旁白: 最近关于xml与json之间的转换都搞蒙了,这里写一个demo,以后备用. 正题: project格式是: jar包是一个一个检出来的,还算干净了. 代码: 工具类: package exer ...
- org.json里实现XML和JSON之间对象互转
org.json包里有一个类org.json.XML可以实现XML和JSON之间的转换.http://www.json.org/javadoc/org/json/XML.html JSONObject ...
随机推荐
- 财务模块多组织,GL, SLA, SOB, COA, BSV, CCID, LE 概念的简单介绍
GL= General Ledger 指的是Oracle 的总帐系统. application_id = 101. 在uk似乎居然还有不同的解释(In the UK, it was refer ...
- Java基础----Java---集合框架---泛型、泛型方法、静态方法泛型、泛型接口、泛型限定、泛型类
泛型:jdk1.5后的新特性,用于解决安全问题,是一个安全机制. 好处: 1.将运行时的异常出现问题classcastException.转移到了编译时期.方便程序员调试解决问题,让运行事情问题减少, ...
- Android初级教程Activity小案例(计算器乘法运算)
首先设置两个布局文件,一个布局文件进行输入数据,获取加法运算:另一个布局文件进行显示最终结果.Activity1启动Activity2,并传递计算结果值给Activity2. main.xml: &l ...
- MySQL数据库安装与配置详解(图文)
接下来看一下如何安装mysql数据库. 由于有更详细的教程资源,因此参考别人的文章以整理.安装教程参考自博客园文章http://www.cnblogs.com/sshoub/p/4321640.htm ...
- 【一天一道LeetCode】#110. Balanced Binary Tree
一天一道LeetCode 本系列文章已全部上传至我的github,地址:ZeeCoder's Github 欢迎大家关注我的新浪微博,我的新浪微博 欢迎转载,转载请注明出处 (一)题目 Given a ...
- Spring MVC 入门示例讲解 - howtodoinjava
在本例中,我们将使用Spring MVC框架构建一个入门级web应用程序.Spring MVC 是Spring框架最重要的的模块之一.它以强大的Spring IoC容器为基础,并充分利用容器的特性来简 ...
- MO_GLOBAL - EBS R12 中 Multi Org 设计的深入研究 (2)
这是多组织访问的第二篇文章,翻译自Anil Passi的Multi Org R12 我们都知道,在Oracle Release 12中多组织模型(Multi Org)会被改变, 它被叫作多组织访问控制 ...
- Android 纵向跑马灯滚动效果
像淘宝和京东都会有跑马灯的效果,今天给大家贡献下以前项目的一个demo,各位看官,且看效果图. 我们先定义一个Bean文件,这个实体类文件主要包含标题,内容描述,以及还有跳转的链接. LampBean ...
- 一键安装gitlab7在rehl6.4上
一键安装gitlab7在rehl6.4上 参考原文: http://blog.csdn.net/ubuntu64fan/article/details/38367579 1 关于gitlab7 无论如 ...
- 【翻译】了解Ext JS 5的小部件
原文:Understanding Widgets in Ext JS 5 在Ext JS 5,引入了新的"widgetcolumn",支持在网格的单元格中放置组件.同时,还在Ext ...