最近一项目中用XML进行数据交互,有一些(多个)不完全相同的XML文档,同样代表不同的数据,即我们在发送,接收时都是一个XML格式字符串,类试<?xml version=”1.0” encoding=”utf-8”?><message version="1.0"><header><messengerid>200911131015330000000001</messengerid><timestamp>20091113101533</timestamp></header><body><elements><element><lotteryid>112</lotteryid><issue>2009111301</issue></element></elements></body></message>这样的字符串.
我们可以用string或StringBuilder进行拼接进行发送,接收时再用XmlDocument进行读取,但这样,每出一个类型的xml的文档,我们都要进行这些相关的操作.后期维护及扩展的工作量都非常大.
于是,我做了如下设计及工作,希望大家学习及指点.一,我把这xml抽象为C#实体类,用属性表示元素(名相同),如元素下不是值,还是元素,再一层层的封装,中间的类实列名为元素名.即把上面的Xml文抽象为如下类结构(先不抽象<message>根目录).并为了演示简单,把所有数据类型都声明为string,
class ElementC
{ public string lotteryid
{get;set;}
public string issue
{get;set;}}
class ElementsC
{ pbulic ElementsC()
{element=new ElementC();}
public ElementC element
{get;set;}}
class BodyC
{public BodyC()
{elements=new ElementsC();}
public ElementsC elements
{get;set;}}
class HeaderC
{public string messengerid
{get;set;}
public string timestamp
{get;set;}}
class xmlDocumentC
{public xmlDocumentC()
{header=new HeaderC();
body=new BodyC();}
public HeaderC header
{get;set;}
public BodyC body
{get;set;}}
另外我用反射写了一个方法,把一个类的实列转换成XML字符串
public static string PropertyToXmlStringPart(object obj)
{//利用反射把类的属性名为XML元素,属性值为元素值,并转换成字符串,其属性支择list<>类型数据,用递归实现,其它类型没有实再.应加实现类,枚举,结构,数组等为属性的元素,有待加强. try
{ Type t = obj.GetType();
XmlDocument xmlDoc = new XmlDocument();
XmlElement root = xmlDoc.createElement_x_x_x_x("root");
foreach (PropertyInfo pi in t.GetProperties())
{ if (pi.PropertyType.IsGenericType)
{ object value1 = pi.GetValue(obj, null);
Type objType = pi.PropertyType;
int count = Convert.ToInt32(objType.GetProperty("Count").GetValue(value1, null));
for (int i = 0; i < count; i++)
{ XmlElement elem = xmlDoc.createElement_x_x_x_x(pi.Name);
object listItem = objType.GetProperty("Item").GetValue(value1, new object[] { i });
elem.InnerXml= PropertyToXmlStringPart(listItem root.A(elem); } }
else if (!pi.PropertyType.IsPrimitive && pi.PropertyType.IsClass && !pi.PropertyType.Name.Equals("String {
XmlElement elem = xmlDoc.createElement_x_x_x_x(pi.Name);
elem.InnerXml = PropertyToXmlStringPart(pi.GetValue(obj, null));
root.A(elem); }
else
{ XmlElement elem = xmlDoc.createElement_x_x_x_x(pi.Name);
try
{ elem.InnerText = pi.GetValue(obj, null).ToString();}
catch
{ elem.InnerText = string.Empty;}
root.A(elem);} }
xmlDoc.A(root);
XmlElement XmlEle = xmlDoc.DocumentElement;
return XmlEle.InnerXml; }
catch(Exception ex)
{ return ex.ToString();
} }
这个方法的输入参数为一个类实例,会根据据其属性值生成相应的XML字符串.
这样把每个类型的XML文档抽象成相应的类后,就可以自动生成XML字符串,方法中可以处理List<>的泛型,其它类型没有处理,但自定义类是没有问题的.
使用如下:xmlDocumentC xc=new xmlDocumentC();
xc.XXX=XXX;....xc付值,
string aa=PropertyToXmlStringPart(xc);这样就完成xml string.再转换为Xml Document就很简单了.
不知这个方法是不是很好,如那位朋友有更好的方法请多指教,
这是把类实列转换为xml string,但如何把xml document转换成类实列呢,以下是一种方法,我自己用反射写的,实现的List和系统定义类型,很笨..NET中有另一方法,我另用文单价绍
public void XmlNodeToObject(XmlNode xnode, object obj)
{
if (xnode.NodeType == XmlNodeType.Text)
{
bool isOk = true;
string fristParent = string.Empty;
fristParent = xnode.ParentNode.Name;
string secendParent = string.Empty;
string thirdParent = string.Empty;
try
{
secendParent = xnode.ParentNode.ParentNode.Name;
}
catch
{
isOk = false;
}
try
{
thirdParent = xnode.ParentNode.ParentNode.ParentNode.Name;
}
catch
{
isOk = false;
}
if (isOk)
{
Type t = obj.GetType();
foreach (PropertyInfo pi in t.GetProperties())
{
object oc = pi.GetValue(obj, null);
// string ccc=oc.GetType().Name;
// string bbbb=pi.PropertyType.Name;
if (oc != null)
{
if (pi.PropertyType.IsGenericType && pi.Name == secendParent)
{
foreach (Type tParam in pi.PropertyType.GetGenericArguments())
{
if (!tParam.IsGenericParameter)
{
Assembly asm = Assembly.GetExecutingAssembly();
int count = Convert.ToInt32(pi.PropertyType.GetProperty("Count").GetValue(pi.GetValue(obj, null), null));
if (count == 0)
{
object objc = asm.CreateInstance(tParam.Name, true);
tParam.GetProperty(fristParent).SetValue(objc, xnode.InnerText, null);
object[] occ = new object[1];
occ[0] = objc;
MethodInfo mi = pi.PropertyType.GetMethod("Add");//这只调用list的Add方法
mi.Invoke(oc, occ);
}
else
{
// bool AddNewOrUpdate = false;//list<T>中的一个T会有多个值,查T中的属性是否为空,为空就写值,否则,创建新的,
//查值
bool CreateNew = true;//确定要不要创建新的
for (int i = 0; i < count; i++)
{
//多项值
object listItem = pi.PropertyType.GetProperty("Item").GetValue(oc, new object[] { i });
if (listItem != null)
{
foreach (PropertyInfo pl in tParam.GetProperties())
{
if (pl.Name == fristParent)//查值是否为空
{
//查值
if (pl.GetValue(listItem, null)==null)
{
//更新值
tParam.GetProperty(fristParent).SetValue(listItem, xnode.InnerText, null);
CreateNew = false;
}
}
}
}
}
if (CreateNew)
{
//添加新的
object objc = asm.CreateInstance(tParam.Name, true);
tParam.GetProperty(fristParent).SetValue(objc, xnode.InnerText, null);
object[] occ = new object[1];
occ[0] = objc;
MethodInfo mi = pi.PropertyType.GetMethod("Add");//这只调用list的Add方法
mi.Invoke(oc, occ);
}
}
}
}
//
}
else if (!pi.PropertyType.IsPrimitive && pi.PropertyType.IsClass && !pi.PropertyType.Name.Equals("String") && pi.Name == secendParent)
{
PropertyInfo pii = oc.GetType().GetProperty(fristParent);
pii.SetValue(oc, xnode.InnerText, null);
}
else if (!pi.PropertyType.IsGenericType && !pi.PropertyType.IsPrimitive && pi.PropertyType.IsClass && !pi.PropertyType.Name.Equals("String"))
{
XmlNodeToObject(xnode, oc);
}
}
}
}
}
else
{
ForeachNodes(xnode, obj);
}
}
public void ForeachNodes(XmlNode node,object obj)
{
XmlNodeList children = node.ChildNodes;
foreach (XmlNode child in children)
{
if (child.NodeType == XmlNodeType.Text)
{
XmlNodeToObject(child, obj);
}
else if(child.NodeType == XmlNodeType.Element)
{
ForeachNodes(child, obj);
}
}
}
分享到:
相关推荐
js读取XMLjs读取XMLjs读取XMLjs读取XMLjs读取XMLjs读取XMLjs读取XMLjs读取XMLjs读取XMLjs读取XML
javascript 解析xml的实例,功能完整 清晰
资源名称:使用Javascript解析xml文件或xml格式字符串 中文WORD版 内容简介: 本文档主要讲述的是使用Javascript解析xml文件或xml格式字符串;javascript中,不论是解析xml文件,...
javaScript解释XML文件,解释获取XML文件节点的值
w3school HTML XML Javascript 全部内容
XML JavaScript java jsp
里面有一个W3School手册,包含web开发所有的前端学习资料,html,js,xml,php等
前端开源库-xml-jsXML JS,XML文本和JavaScript对象/JSON文本之间的转换器。
应用ASP XML JavaScript技术开发网络教室电子点名系统.pdf
Javascript读取XML Javascript读取XMLJavascript读取XMLJavascript读取XMLJavascript读取XMLJavascript读取XMLJavascript读取XMLJavascript读取XMLJavascript读取XMLJavascript读取XMLJavascript读取XMLJavascript...
xmljs_translator 读取 JSON 文件并将其转换为 XML。 读取 XML 文件并将其转换为 JSON。你为什么创造这个? 我花了很多时间研究可以在没有浏览器的情况下工作的 JS 到 XML 转换器。 我发现每个工具都有自己的做事...
javascript 操作xml javascript 操作xml javascript 操作xml javascript 操作xmljavascript 操作xmljavascript 操作xml
js 操作xml 文件 读取xml文件 js 操作xml 文件 读取xml文件
搜集的滚动页面代码,轮显代码,常用滚动页面代码,轮显,交替图片,源码FLASH XML JS代码,JS滚动页面代码,flash滚动页面,轮显图片
在前台页面调用javascript,读写XML文件
jquery.json2xml.js&&jquery.xml2json.js在jQuery的基础上实现json与xml的相互转换
Js+XML 操作应用:JS解析XML文件和XML字符串 支付接口常用,亲测可用!
Javascript验证xml格式正确,合法。
带缩略图与箭头控制的Flash图片切换,XML JS版,平滑过渡的广告代码,使用flashObject.js扩展和增强了性能,联想网站曾经使用过的图片效果,显示缩略图功能,每点击一下缩略图,大图就会显示出来,而且是平滑滑动的...
js读取xml文件并获取文件内容