学习VB.NET时,你可能会遇到VB.NET fnSimpleObjectToXML问题,这里将介绍VB.NET fnSimpleObjectToXML问题的解决方法,在这里拿出来和大家分享一下。
专注于为中小企业提供网站建设、网站制作服务,电脑端+手机端+微信端的三站合一,更高效的管理,为中小企业大通免费做网站提供优质的服务。我们立足成都,凝聚了一批互联网行业人才,有力地推动了超过千家企业的稳健成长,帮助中小企业通过网站建设实现规模扩充和转变。
1、我将这个半自动初始化文件类命名为clsAPPOption,类内结构及包含过程的功能说明如下:
两个区域#Region "应用程序使用的选项结构定义"、#Region "应用程序选项的变量声明"中的内容是按初始化选项级组织的类及类的实例,每一个类表示程序选项的一个初始化节,必须由最终使用者根据实际选项需要自行手工补充。
◆fnGetAppDirectory:取得应用程序的运行目录
◆sbInitialDefaultAPPOption:设置程序选项的默认初始值(这个过程中的代码需根据实际需要手工修改)。
◆fnSaveAppOption:将类内的程序选项保存到一个指定的文件中. (这个过程中的部分代码需根据实际需要手工修改)
◆fnLoadAppOption:在指定的文件中读取应用程序的选项信息并保存到当前类中(这个过程中的部分代码需根据实际需要手工修改)。
◆fnXMLElementToSimpleObject:将一个XMLElement转为它代表的简单对象,所谓简单对象就是诸如int32\int16之类的基本net对象。
◆fnXMLElementToClassObject:将一个XMLElement转换为它代表的类对象。
◆fnXMLElementToArray:将一个XMLElement转为它代表的数组。
◆fnArrayToXML:将一个数组放入XML文件中,目前只支持一维数组:例如dim aString(10) as string
◆fnClassObjectToXML:将一个类对象转换为xml元素的表示形式。
◆VB.NET fnSimpleObjectToXML:将一个简单对象改为XML元素表示
◆注:其中fnXMLElementToXXXX和fnXXXXToXML功能相对应,互为反函数。
2、程序的实现是非常简单的,fnClassObjectToXML对指定的类进行反射操作,使用类的类型的GetFields方法枚举类内的成员变量信息,然后根据成员变量的类型调用VB.NET fnSimpleObjectToXML或fnArrayToXML,在函数结束的时候,将要转换的类以一个 XMLElement对象的形式返回。
- For Each tobjFieldInfo In tobjClassObjectType.GetFields
- If tobjFieldInfo.FieldType.IsArray = False Then '只是一个简单类型,直接取得值
- tobjXMLElement = fnSimpleObjectToXML(tobjFieldInfo.GetValue(ni_objClassObject), _
- ni_objXMLDocument, _
- tobjFieldInfo.Name)
- tobjXMLClassObjectElement.AppendChild(tobjXMLElement)
- Else
- REM 如果是一个数组类型,则进行数组方法的调用以取得值,
- '目前只支持一维数组元素
- tobjXMLElement = fnArrayToXML(tobjFieldInfo.GetValue(ni_objClassObject),
ni_objXMLDocument, tobjFieldInfo.Name, tobjFieldInfo.FieldType.FullName)- '将数组对象放入结构的xml对象中
- tobjXMLClassObjectElement.AppendChild(tobjXMLElement)
- End If
VB.NET fnSimpleObjectToXML的实现也很简单,根据前文确立的简单对象的定义,VB.NET fnSimpleObjectToXML过程所要生成的xml对象的几个要素可以这样获取:ObjectName在f nClassObjectToXML作反射后已经获取,并以参数传递的方式在调用VB.NET fnSimpleObjectToXML时提供了。 ObjectType数据类型则可以利用ni_objSimpleObject.GetType.FullName方法取得, ni_objSimpleObject就是在函数调用时传入的简单对象的值。
在编写fnArrayToXML过程时出现了一点小问题,由于调用方不可能要求数组的元素逐个传入,所以对数组的元素个数以及元素的值无法在函数中以对象反射的方式直接获取。幸运的是,在Net反射操作中,可以利用Invoke方法来调用原始对象内的函数或属性过程,而数组的共享方法GetLength、GetValue功能适好是取数组元素个数及指定下标的元素值,所以问题立刻迎刃而解。
- '利用反射调用数组的getLenght方法取得数组的大小,这里仅支持一维数组,但对于初始化文件已足够用了
- tobjXMLAttribute = ni_objXMLDocument.CreateAttribute("ArrayLength")
- tobjMethodInfo = tobjArrayType.GetMethod("GetLength")
- ReDim taobjParameter(0)
- taobjParameter(0) = 0
- ti32Tempa = tobjMethodInfo.Invoke(ni_objArray, taobjParameter)
- tobjXMLAttribute.Value = ti32Tempa
- tobjXMLElement.SetAttributeNode(tobjXMLAttribute)
- tobjXMLAttribute = Nothing
- '加入数组的内的元素
- For ti32LoopA = 0 To ti32Tempa - 1
- '利用反射取得数组的GetValue方法取得实际元素的值
- ReDim taobjParameterType(0)
- taobjParameterType(0) = GetType(Integer)
- tobjMethodInfo = tobjArrayType.GetMethod("GetValue", taobjParameterType)
- ReDim taobjParameter(0)
- taobjParameter(0) = ti32LoopA
- tobjTempa = tobjMethodInfo.Invoke(ni_objArray, taobjParameter)
- ' 将数组元素放入对xml对象中
- tobjXMLElementA = fnSimpleObjectToXML(tobjTempa, ni_objXMLDocument, ti32LoopA)
- tobjXMLElement.AppendChild(tobjXMLElementA)
- Next ti32LoopA
从XML转为net对象的过程基本都没有什么技术难度。我只是根据xml中包含的ObjectType信息简单获得简单对象的类型,然后直接调用net强制转换类的功能将XML文件中指定的对象储存的数值重新恢复为原来的net对象。代码如下:
- '根据XMLelement结构元素中指定的对象类型,建立对象
- tobjType = Type.GetType(tobjXmlSimpleObjectElement.GetAttribute("ObjectType"))
- tobjReturnSimpleObject = Convert.ChangeType(tobjXmlSimpleObjectElement.InnerText, tobjType, Nothing)
对于Xml转为数组用数组、转为类对象的方法可以参阅本文所附源代码。
【编辑推荐】
网页题目:描述VB.NETfnSimpleObjectToXML
分享地址:http://www.shufengxianlan.com/qtweb/news32/486132.html
网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等
声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联