由于之前比较懒惰,懒得写博客,也懒得写总结,以至于开发经验已有一年多些的程序猿一枚仍旧处于入门阶段,所以决定做些改变,多写写技术博客,感觉这个挺好,既能锻炼文采,也能巩固技术,可谓一举多得。PS:目前对我这种入门级的小虾米来说,写几个技术博客主要是防止自己忘记做过哪些东西,学过哪些技术,其他的倒没什么大作用,好了,开始记录今天晚上的一个xml读取的小例子。
Control_Widget.xml(自己简单的设计了一下格式,基本上符合我的要求,简单易读,易于扩展)
<?xml version="1.0"?> <TestProject xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <ControlList> <control_Widget> <Name>testName1</Name> <Value>testValue1</Value> <Property>testProperty1</Property> <Type>testType1</Type> <Validate>testValidate1</Validate> </control_Widget> <control_Widget> <Name>testName2</Name> <Value>testValue2</Value> <Property>testProperty2</Property> <Type>testType2</Type> <Validate>testValidate2</Validate> </control_Widget> <control_Widget> <Name>testName3</Name> <Value>testValue3</Value> <Property>testProperty3</Property> <Type>testType3</Type> <Validate>testValidate3</Validate> </control_Widget> </ControlList> </TestProject>
这也算是今天的一个小难题,因为之前并没有真正意义上的解析过xml,所以今天在解析xml的时候,就频繁报错儿(本人数学不好,估计影响很大),后来在公司解决无果,就果断选择回家,Andy说一般反序列化解析xml,速度会相当快,所以路上就拿手机上网搜了下,简单的了解下,回家开始动手,就做了个这样儿的简单的Demo。
首先根据该XML文件的结构,设计了如下的实体类库:
//Serializable class public class TestProject { public List<Control_Widget> ControlList = new List<Control_Widget>(); } //Xml ArrayList public class Control_Widget { public string Name; public string Value; public string Property; public string Type; public string Validate; }
因为这样的话,我就基本不用对xml文档进行大规模改动(xml文件中数据不多不少,改起来也足够费劲的)。
OK,那么接下来,就应该按照国际惯例,开始写解析的方法:
XmlReader类部分代码
public List<Control_Widget> controlTotalList;//the list of Control_Widget string path = "C:\\C#Project\\ControlWidget.xml"; //read xml file content,and add to List public void ReadXmlFile() { FileStream fs = null; TestProject testPrj = new TestProject(); try { XmlSerializer xs = new XmlSerializer(typeof(TestProject)); fs = new FileStream(path, FileMode.Open, FileAccess.Read); testPrj = (TestProject)xs.Deserialize(fs); controlTotalList = new List<Control_Widget>(); controlTotalList = testPrj.ControlList; } catch (Exception) { throw; } }
经过这样的操作之后,xml文件中的内容就被解析出来并且存到类的局部变量controlTotalList集合中,当然,我要求的功能还有一步,就是要根据xml文件的Name标签中的内容来查询相对应的Value标签中的内容,那么,再添加如下的GetValueByName方法:
public string GetValueByName(string name) { string value = ""; if (name != null && name != "") { if (controlTotalList != null) { for (int i = 0; i < controlTotalList.Count; i++) { if (controlTotalList[i].Name == name) { value = controlTotalList[i].Value; } } } else { ReadXmlFile(); GetValueByName(name); } } return value; }
OK,大功告成!一个基本的xml反序列化的例子就这样儿完成了。
写完博客,睡觉去了,晚安北京!加油明天!