当一个xml中有大量的属性XmlAttribute需要序列化和反序列化,通常需要复制粘贴大量的如下代码,显得很丑陋,而且容易出错:

XmlAttribute attr = Doc.CreateAttribute("MaterialMark");
attr.Value = myObject.MaterialMark;
xmlroot.Attributes.Append(attr)

XmlAttribute attr = mlnode.Attributes["MaterialMark"];
if (attr != null)
myObject.index = findex.Value;

可以使用反射技术,做出修改,如下:

public Class MyObject
{
public string A
{
get;
set;
} public int B
{
get;
set;
} public double C
{
get;
set;
} }
    void getAttrFromXml(MyObject myObject,XmlNode xmlNode)
{
foreach (XmlAttribute attr in xmlNode.Attributes)
{
object val = attr.Value;
Type type = typeof(MyObject);
PropertyInfo proInf = type.GetProperty(attr.Name);
switch (proInf.PropertyType.ToString())
{
case "System.String":
proInf.SetValue(myObject, val, null);
break; case "System.Double":
double result = ;
double.TryParse(val.ToString(), out result);
proInf.SetValue(myObject, result, null);
break; default:
//自己添加用到的类型
break;
}
}
}
        void setAttrFromObject(MyObject myobject, XmlNode xmlNode)
{
Type type = typeof(MyObject);
foreach (PropertyInfo proInf in type.GetProperties())
{
XmlAttribute attr = xmlNode.OwnerDocument.CreateAttribute(proInf.Name);
if(proInf.GetValue(myObject,null)!=null)
attr.Value = proInf.GetValue(myObject,null).ToString();
xmlNode.Attributes.Append(attr);
}
}

反序列化和序列化xml使用反射处理节点的属性的更多相关文章

  1. Xml文档添加节点和属性

    XmlDocument doc = new XmlDocument(); XmlElement xmlElement = doc.CreateElement("节点名称"); xm ...

  2. XMLHelper类 源码(XML文档帮助类,静态方法,实现对XML文档的创建,及节点和属性的增、删、改、查)

    以下是代码: using System; using System.Collections.Generic; using System.Linq; using System.Web; using Sy ...

  3. 已看1.熟练的使用Java语言进行面向对象程序设计,有良好的编程习惯,熟悉常用的Java API,包括集合框架、多线程(并发编程)、I/O(NIO)、Socket、JDBC、XML、反射等。[泛型]\

    1.熟练的使用Java语言进行面向对象程序设计,有良好的编程习惯,熟悉常用的Java API,包括集合框架.多线程(并发编程).I/O(NIO).Socket.JDBC.XML.反射等.[泛型]\1* ...

  4. 答:SQLServer DBA 三十问之一: char、varchar、nvarchar之间的区别(包括用途和空间占用);xml类型查找某个节点的数据有哪些方法,哪个效率高;使用存储 过程和使用T-SQL查询数据有啥不一样;

    http://www.cnblogs.com/fygh/archive/2011/10/18/2216166.html 1. char.varchar.nvarchar之间的区别(包括用途和空间占用) ...

  5. WCF中序列化(XML\JSON\Dt)

    序列化 是将对象转换为容易传输的格式的过程.例如,可以序列化一个对象,然后使用 HTTP 通过 Internet 在客户端和服务器之间传输该对象.反之,反序列化根据流重新构造对象. 序列化描述了持久化 ...

  6. C#序列化xml,开发常用

    序列化操作对于开发人员来说最熟悉不过了. 序列化分为:序列化和反序列化. 序列化名词解释:序列化是将对象状态转换为可保持或传输的格式的过程. 与序列化相对的是反序列化,它将流转换为对象.这两个过程结合 ...

  7. Tomcat解析XML和反射创建对象原理

    Tomcat解析XML和反射创建对象原理 import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Me ...

  8. C#中操作xml文件(插入节点、修改、删除)

    已知有一个xml文件(bookstore.xml)如下: <?xml version="1.0" encoding="gb2312"?> <b ...

  9. (转载)读取xml中的指定节点的值

            /// <summary>         /// 读取xml中的指定节点的值        /// </summary>         private st ...

随机推荐

  1. 数组去重复的时候遇到length变成1 的bug

    arrUnique:function(arr){ //传入空数组的时候有bug,length会变成1 所以修复下 if(arr.length == 0){ return []; } arr.sort( ...

  2. unity中获取七天的日期

    private List<string> Date; private List<string> Day; private string now; private WMG_Axi ...

  3. FFT与一些冷门问题

    FFT也能用于一些特殊的字符串匹配与最小化问题. Prob 1 : 给出模式串A与文本串B,两个串中只有26个大写字母与通配符'?'(即可以任意匹配一个字符),求A在B中的匹配数.要求以FFT为例给出 ...

  4. 世界上最好的Sed教程

    这是一份世界上最好的sed教程,sed是unix系统下流编辑里的超人.最初我写这份说明是为了我的 第二本电子书,然而随后我决定把这份说明变成一本免费电子书预览的同时再次做为文章发布到这里. Sed说明 ...

  5. ionic2一个需求模块的文件该是这样子的

    1.组件文件夹的文件 除了index.ts 其他文件为各个页面组件文件 2.index.ts的代码如下 import {SecurityFinance} from "./security-f ...

  6. 1) 嵌套的 div ,或者 ul ol .li 阻止冒泡 ,特别是 对应onclick="test(event)" 通过传递event 阻止 冒泡. cancelBubble , stopPropagation

    1 .html 结构: <ul class="ul_2 hide" data-first="5"> <li class="li_2& ...

  7. openFileDialog的使用

    这两天应用了一下openFileDialog,做的是上传的功能,在打开页面的时候进行的一系列操作虽说远远没有asp.net的上传控件好使,但是学习起来也是蛮还用的,下面是一个简单的应用 //点击浏览按 ...

  8. 当你在web项目下新建一个class时package位置如果发生红色波浪错误,提示为”The type java.io.ObjectInputStream cannot be resolved. It is indirectly referenced from required .class files“

    问题是这样的如下图: 问题的原因: 1.配置tomcat7.0的时候自己设置了jre的版本1.8,而没有用myeclipse10自带的jre1.6,导致了出现了差错!

  9. SpringBoot(三)thymeleaf+JPA+MySql

    接着上一节的 第一步:在pom文件中加入以下代码: <!--JPA--> <dependency> <groupId>org.springframework.boo ...

  10. “必须执行Init_Clk函数,才能采集到二氧化碳接口485数据的问题”的解决

    这个问题困扰了我很长一段时间,而且如果这个问题不解决,就有一个无法调和的矛盾:执行Init_Clk函数,能采集到二氧化碳接口485数据,但是功耗大:不执行Init_Clk函数,不能采集到二氧化碳接口4 ...