NET使XML串行化易如反掌

合集下载

vb.net xml 转义方法

vb.net xml 转义方法

程序员经常需要在其应用程序中处理XML数据。

在处理XML 数据时,转义是一个非常重要的问题。

XML转义是指将XML文件中的特殊字符转换为对应的实体引用,以便在XML文档中正常显示这些特殊字符。

本文将介绍如何在中进行XML转义,同时提供一些常见的转义方法和示例。

一、特殊字符的转义方法在XML中,以下五个字符被定义为特殊字符:、<、>、"和'。

这些特殊字符如果直接出现在XML文档中,将会被解释为XML标记,而不是文本数据。

需要将这些特殊字符转义为对应的实体引用,以便在XML文档中正常显示。

下面是五个特殊字符在XML中的实体引用:1. 转义为 amp;2. < 转义为 lt;3. > 转义为 gt;4. " 转义为 quot;5. ' 转义为 apos;二、在中进行XML转义在中进行XML转义非常简单。

可以使用System.Security.SecurityElement.Escape方法来对字符串进行XML 转义。

该方法可以将字符串中的特殊字符替换为对应的实体引用。

示例代码如下所示:```Dim originalString As String = "This is a lt;testgt; string with quot;specialquot; characters"Dim escapedString As String =System.Security.SecurityElement.Escape(originalString) Console.WriteLine(escapedString)```运行以上代码,会得到如下输出:```textThis is a amp;lt;testamp;gt; string withamp;quot;specialamp;quot; characters```从输出结果可以看出,原始字符串中的特殊字符已经被成功转义为对应的实体引用。

DotNet框架中的XML

DotNet框架中的XML
.NET中的 中的XML 中的
DataSet与XML / XML序列化 与 序列化
教学目标
• 掌握 掌握2.0中操作 中操作xml 中操作 • 掌握XML序列化 掌握 序列化
2.0中操作xml
• 1.使用XML控件 • 注意:为XML控件配置DocumentSourse属性
2.0中操作xml
• 效果
2.0中操作xml
• 3.使用DataSet创建XML文件
• 在Default.aspx视图编辑页面添加一个Button控件 如图
• • • • • • • • • • • • • • • • •
双击Button控件在其Button1_Click方法中添加如下代码: DataSet myds = new DataSet(); DataTable mydt = new DataTable("Squares"); DataRow mydr; mydt.Columns.Add(new DataColumn("数字",typeof(Int32))); mydt.Columns.Add(new DataColumn("平方",typeof(Int32))); ////定义主键 mydt.PrimaryKey = new DataColumn[] { mydt.Columns["数字"] }; for (int i = 0; i < 5; i++) { mydr = mydt.NewRow(); mydr[0] = i; mydr[1] = i * i; mydt.Rows.Add(mydr); } myds.Tables.Add(mydt); myds.WriteXml(Server.MapPath("Squares.xml"));

.NET框架中的XML串行化(序列化)

.NET框架中的XML串行化(序列化)

.NET框架中的XML串行化(序列化)
YellowWee
【期刊名称】《《程序员:CSDN开发高手》》
【年(卷),期】2004(000)007
【摘要】串行化是把程序中的对象(Object)转换为容易传输的格式的过程。

串行化对象后生成的这些字节可以写入文档以备后用、通过网络连接传输到其他程序、用来对初始对象进行拷贝等等。

串行化后的对象在传递过程中可以经过一段空间(如在RMI中)或时间(如对象被转为数据流)后保存在文件中。

例如,我们可能需要将一个对象(如:ArrayList)
【总页数】6页(P114-119)
【作者】YellowWee
【作者单位】
【正文语种】中文
【中图分类】TP311
【相关文献】
Framework中XML序列化研究 [J], 陈忠睿;刘齐宏
框架实现基于XML的串行化 [J], 杨雅惠;韦参梅
3.探讨和比较Java和.NET的序列化(Serialization)框架 [J], 游智超
4.XML数据库中锁协议机制下是可串行化调度分析 [J], 严伟中;朱巧明
Framework中二进制与XML序列化方法的比较 [J], 范东明;王坚;戴毅茹
因版权原因,仅展示原文概要,查看原文内容请购买。

.NET对象的XML序列化和反序列化

.NET对象的XML序列化和反序列化

.NET对象的XML序列化和反序列化序列化是指⼀个对象的实例可以被保存,保存成⼀个⼆进制串,当然,⼀旦被保存成⼆进制串,那么也可以保存成⽂本串了。

⽐如,⼀个计数器,数值为2,我们可以⽤字符串“2”表⽰。

如果有个对象,叫做connter,当前值为2,那么可以序列化成“2”,反向的,也可以从“2”得到值为2的计数器实例。

这样,关机时序列化它,开机时反序列化它,每次开机都是延续的。

不会都是从头开始。

序列化概念的提出和实现,可以使我们的应⽤程序的设置信息保存和读取更加⽅便。

序列化有很多好处,⽐如,在⼀台机器上产⽣⼀个实例,初始化完毕,然后可以序列化,通过⽹络传送到另⼀台机器,然后反序列化,得到对象实例,之后再执⾏某些业务逻辑,得到结果,再序列化,返回第⼀台机器,第⼀台机器得到对象实例,得到结果。

这个例⼦是⽬前⽐较先进的“智能代理”的原理。

当前⽐较热⽕的web services使⽤soap协议,soap协议也是以对象的可序列化为基础的。

⼀概述.NET Framework为处理XML数据提供了许多不同的类库。

XmlDocument类能让你像处理⽂件⼀样处理xml数据,⽽XmlReader、XmlWriter和它们的派⽣类使你能够将xml数据作为数据流处理。

XmlSerializer则提供了另外的⽅法,它使你能够将⾃⼰的对象串⾏化和反串⾏化为xml。

串⾏化数据既能够让你像处理⽂件⼀样对数据进⾏随机处理,同时⼜能跳过你不感兴趣的数据。

⼆主要类库介绍.NET ⽀持对象xml序列化和反序列化的类库主要位于命名空间System.Xml.Serialization中。

1. XmlSerializer 类该类⽤⼀种⾼度松散耦合的⽅式提供串⾏化服务。

你的类不需要继承特别的基类,⽽且它们也不需要实现特别的接⼝。

相反,你只需在你的类或者这些类的公共域以及读/写属性⾥加上⾃定义的特性。

XmlSerializer通过反射机制读取这些特性并⽤它们将你的类和类成员映射到xml元素和属性。

.net反序列化漏洞原理

.net反序列化漏洞原理

.net反序列化漏洞原理
.NET反序列化漏洞是一种安全漏洞,它涉及到.NET应用程序中
的反序列化过程。

在.NET中,反序列化是将序列化的数据转换为对
象的过程。

当应用程序从外部源(如网络、文件等)接收序列化数
据并对其进行反序列化时,如果未对输入进行充分验证和过滤,就
可能导致反序列化漏洞。

攻击者可以利用这种漏洞来执行恶意代码,进行远程代码执行等攻击。

具体原理是,攻击者通过构造恶意的序列化数据,利用.NET反
序列化过程中的漏洞触发恶意代码执行。

这可能涉及到利用.NET框
架中的一些反序列化函数或特性,如BinaryFormatter、DataContractSerializer等。

攻击者可以通过修改序列化数据中的
类型信息、构造恶意对象图等方式来欺骗应用程序,使其在反序列
化过程中执行恶意代码。

为防范.NET反序列化漏洞,开发人员应该对反序列化输入进行
严格的验证和过滤,避免直接反序列化不受信任的数据。

同时,可
以考虑使用安全的序列化库、限制反序列化的类型等措施来降低漏
洞风险。

另外,及时更新.NET框架和相关组件也是防范漏洞的重要
措施。

综上所述,了解.NET反序列化漏洞的原理并采取相应的安全措施对于保护.NET应用程序的安全至关重要。

.Net中的XmlReader与XmlWriter解析

.Net中的XmlReader与XmlWriter解析
XmlWriterSettings settings = new XmlWriterSettings();
settings.Indent = true; //是否缩进
settings.NewLineOnAttributes = true;//把每个属性写在一行,这样做可以更容易读取
XMLXmlWriter writer = XmlWriter.Create("booknew.xml",settings);
} (1)使用静态方法Create(),返回一个XmlReader对象。
(2)Read()方法可以进入下一个节点。
XmlReader类还可以读取强类型化的数据,它有几个ReadValuesAs方法,如、ReadValueAsDouble、ReadValueAsBoolean等。
检索属性数据
AttributeCountry属性确定属性个数。GetAttribute()方法按照名称或索引来获取属性,如果要一次迭代一个属性就可以使用MoveToFirstAttribute()和MoveToNextAttribute()方法。
richTextBox1.Clear();
writer.WriteStartDocument();
writer.WriteStartElement("book");
writer.WriteAttributeString("genre","Mystery");
writer.WriteAttributeString("publicationdate","2001");
writer.WriteEndElement();

.NET(C#)使用Serialize、Deserialize序列和反序列化XML文档

.NET(C#)使用Serialize、Deserialize序列和反序列化XML文档

.NET(C#)使⽤Serialize、Deserialize序列和反序列化XML⽂档本⽂给⼤家分享⼀下C#操作(读取、写⼊)XML⽂档的实⽤⽅法,即⽤.NET本⾝提供的Deserialize和Serialize进⾏反序列化和序列化XML⽂档。

这种⽅法主要是对⽐较规范的XML⽂档进⾏操作,因为它(XML⽂档)和类对象是严格对应的,否则在反序列或序列化的时候会出现错误。

其他的不⽤多说,直接看⽰例代码吧:using System;using System.Collections.Generic;using System.IO;using System.Linq;using System.Text;using System.Threading.Tasks;using System.Xml.Serialization;namespace _01XMLSerialize{class Program{private static List<UserInfo> list = new List<UserInfo>(){new UserInfo(){Id = 1,UserName = "张三",UserPass = "FDASDFAS",Email = "zhangsan@",RegTime = DateTime.Now},new UserInfo(){Id = 2,UserName = "李四",UserPass = "FDASDFAS",Email = "lisi@",RegTime = DateTime.Now},new UserInfo(){Id = 3,UserName = "王五",UserPass = "FDASDFAS",Email = "wangwu@",RegTime = DateTime.Now},new UserInfo(){Id = 4,UserName = "赵六",UserPass = "FDASDFAS",Email = "zhaoliu@",RegTime = DateTime.Now},new UserInfo(){Id = 5,UserName = "⽥七",UserPass = "FDASDFAS",Email = "tianqi@",RegTime = DateTime.Now},new UserInfo(){Id = 6,UserName = "王⼋",UserPass = "FDASDFAS",Email = "wangba@",RegTime = DateTime.Now}};static void Main(string[] args){//序列化对象⽣成⽂件WriteSingleXml();//反序列化⽂件⽣成对象ReadListXml();Console.ReadKey();}///<summary>///从XML⽂件中反序列化对象///</summary>private static void ReadListXml(){//反序列化⽂件Console.WriteLine("反序列化XML⽂件为集合");var reader = new XmlSerializer(typeof(List<UserInfo>));using (var fs = File.OpenRead("UserInfo.xml")){var result = reader.Deserialize(fs) as List<UserInfo>;result.ForEach(Console.WriteLine);}Console.WriteLine("反序列化成功");}///<summary>///序列化对象到XML⽂件///</summary>private static void WriteSingleXml(){//序列化集合为xml⽂件Console.WriteLine("序列化集合为XML⽂件");var reader = new XmlSerializer(typeof(List<UserInfo>));//写⼊⽂件using (var fs = File.OpenWrite("UserInfo.xml")){reader.Serialize(fs, list);}Console.WriteLine("写⼊成功");}}}运⾏结果如图:⽣成的XML⽂档如下:<?xml version="1.0"?><ArrayOfUserInfo xmlns:xsi="/2001/XMLSchema-instance" xmlns:xsd="/2001/XMLSchema"> <UserInfo><Id>1</Id><UserName>张三</UserName><UserPass>FDASDFAS</UserPass><Email>zhangsan@</Email><RegTime>2016-04-21T09:15:58.5576551+08:00</RegTime></UserInfo><UserInfo><Id>2</Id><UserName>李四</UserName><UserPass>FDASDFAS</UserPass><Email>lisi@</Email><RegTime>2016-04-21T09:15:58.5576551+08:00</RegTime> </UserInfo><UserInfo><Id>3</Id><UserName>王五</UserName><UserPass>FDASDFAS</UserPass><Email>wangwu@</Email><RegTime>2016-04-21T09:15:58.5576551+08:00</RegTime> </UserInfo><UserInfo><Id>4</Id><UserName>赵六</UserName><UserPass>FDASDFAS</UserPass><Email>zhaoliu@</Email><RegTime>2016-04-21T09:15:58.5576551+08:00</RegTime> </UserInfo><UserInfo><Id>5</Id><UserName>⽥七</UserName><UserPass>FDASDFAS</UserPass><Email>tianqi@</Email><RegTime>2016-04-21T09:15:58.5576551+08:00</RegTime> </UserInfo><UserInfo><Id>6</Id><UserName>王⼋</UserName><UserPass>FDASDFAS</UserPass><Email>wangba@</Email><RegTime>2016-04-21T09:15:58.5576551+08:00</RegTime> </UserInfo></ArrayOfUserInfo>。

ASP.NET对类进行XML序列化和反序列化

ASP.NET对类进行XML序列化和反序列化

对类进⾏XML序列化和反序列化1 序列化⽅法public void SerializeObject<T>(string Xmlname,T t){XmlSerializer ser = new XmlSerializer(typeof(T));TextWriter writer = new StreamWriter(Xmlname);ser.Serialize(writer, t);//要序列化的对象writer.Close();}2 序列化⽅法的使⽤NodeConfigInfo nc = new NodeConfigInfo();nc.FirstNodeSql = this.textBoxSqlFirstNode.Text.Trim();nc.FirstArticleSql = this.textBoxViewFirArtlcle.Text.Trim();nc.SecondNodeSql = this.textBoxSqlSecondNode.Text.Trim();nc.SecondArticleSql = this.textBoxViewSecArtlcle.Text.Trim();nc.SecondNodeFilter = this.textBoxSecFilter.Text.Trim();nc.SecondArticleFilter = this.textBoxSecFilter.Text.Trim();nc.SecondNodeDefaultParentId = this.textBoxParentDefault.Text.Trim();nc.ConnectionOther = this.textBoxConnection.Text.Trim();nc.NodeId = this.textBoxParentId.Text.Trim();nc.SecondReFilter = this.textBoxReFilterSec.Text.Trim();string xmlName = System.IO.Directory.GetCurrentDirectory() + "\\" + typeof(NodeConfigInfo).Name + ".Config";SerializeObject<NodeConfigInfo>(xmlName, nc);3 序列化的类public class NodeConfigInfo{public string FirstNodeSql { get; set; }public string FirstArticleSql { get; set; }public string SecondNodeSql { get; set; }public string SecondArticleSql { get; set; }public string SecondNodeFilter { get; set; }public string SecondArticleFilter { get; set; }public string SecondNodeDefaultParentId { get; set; }public string ConnectionOther { get; set; }public string NodeId { get; set; }public string SecondReFilter { get; set; }}4 反序列化⽅法public T DeSerializeObject<T>(){string xmlName = System.IO.Directory.GetCurrentDirectory() + "\\" + typeof(T).Name + ".Config";FileStream file = new FileStream(xmlName, FileMode.Open, FileAccess.Read);XmlSerializer xmlSearializer = new XmlSerializer(typeof(T));T info = (T)xmlSearializer.Deserialize(file);file.Close();file.Dispose();return info;}5 反序列化⽅法的使⽤//xml来源可能是外部⽂件,也可能是从其他系统获得NodeConfigInfo info = DeSerializeObject<NodeConfigInfo>();this.textBoxSqlFirstNode.Text = info.FirstNodeSql;this.textBoxViewFirArtlcle.Text = info.FirstArticleSql;this.textBoxSqlSecondNode.Text = info.SecondNodeSql;this.textBoxViewSecArtlcle.Text = info.SecondArticleSql;this.textBoxSecFilter.Text = info.SecondNodeFilter;this.textBoxSecFilter.Text = info.SecondArticleFilter;this.textBoxParentDefault.Text = info.SecondNodeDefaultParentId; this.textBoxConnection.Text = info.ConnectionOther;this.textBoxParentId.Text = info.NodeId;this.textBoxReFilterSec.Text = info.SecondReFilter;。

XML反序列化出错,XML文档(2,2)中有错误

XML反序列化出错,XML文档(2,2)中有错误

XML反序列化出错,XML⽂档(2,2)中有错误XML转换为实体类的错误处理⽅案⼀.错误描述:XML反序列化出错,XML ⽂档(2, 2)中有错误⼆.解决⽅案:在实体类的字段要加上XmlElement属性三.具体实现:1.XML⽂档<EVENT_INSTANCE><EventType>ALTER_TABLE</EventType><PostTime>2015-08-04T10:21:14.670</PostTime><SPID>175</SPID><ServerName>E6SER14</ServerName><LoginName>sa</LoginName><UserName>dbo</UserName><DatabaseName>E6ETms</DatabaseName><SchemaName>ETms</SchemaName><ObjectName>Driver</ObjectName><ObjectType>TABLE</ObjectType><AlterTableActionList><Drop><Constraints><Name>DF_Driver_DriverID</Name></Constraints></Drop></AlterTableActionList><TSQLCommand><SetOptions ANSI_NULLS="ON" ANSI_NULL_DEFAULT="ON" ANSI_PADDING="ON" QUOTED_IDENTIFIER="ON" ENCRYPTED="FALSE" /> <CommandText>ALTER TABLE ETms.DriverDROP CONSTRAINT DF_Driver_DriverID</CommandText></TSQLCommand></EVENT_INSTANCE>2.⽬标实体对象[XmlRoot(ElementName = "EVENT_INSTANCE")][Serializable]public class EventModel{[XmlElement(ElementName = "EventType")]public string EventType { set; get; }[XmlElement(ElementName = "PostTime")]public string PostTime { set; get; }[XmlElement(ElementName = "SPID")]public string Spid { set; get; }[XmlElement(ElementName = "ServerName")]public string ServerName { set; get; }[XmlElement(ElementName = "UserName")]public string UserName { set; get; }[XmlElement(ElementName = "DatabaseName")]public string DatabaseName { set; get; }[XmlElement(ElementName = "SchemaName")]public string SchemaName { set; get; }[XmlElement(ElementName = "ObjectName")]public string ObjectName { set; get; }[XmlElement(ElementName = "ObjectType")]public string ObjectType { set; get; }[XmlElement(ElementName = "TargetObjectName")]public string TargetObjectName { set; get; }[XmlElement(ElementName = "TargetObjectType")]public string TargetObjectType { set; get; }[XmlElement(ElementName = "PropertyName")]public string PropertyName { set; get; }[XmlElement(ElementName = "PropertyValue")]public string PropertyValue { set; get; }[XmlElement(ElementName = "Parameters")]public Parameters Parameters { get; set; }[XmlElement(ElementName = "TSQLCommand")]public TsqlCommand TsqlCommand { get; set; }}public class TsqlCommand{[XmlElement(ElementName = "CommandText")]public string CommandText { set; get; }[XmlElement(ElementName = "SetOptions")]public string SetOptions { set; get; }}public class Parameters{[XmlElement("Param")]public List<string> ParamContent { get; set; }}3.XML转实体类测试//xmlStr 是xml字符串;type是要转换⽬标实体的类型【typeof (EventModel)】;public static object DeserializeFromXml(string xmlStr, Type type){try{using (StringReader sr = new StringReader(xmlStr)){XmlSerializer xs = new XmlSerializer(type);return xs.Deserialize(sr);}}catch (Exception ex){throw (ex);}}。

C#:.net序列化及反序列化[XmlElement(“节点名称”)][XmlAttrib。。。

C#:.net序列化及反序列化[XmlElement(“节点名称”)][XmlAttrib。。。

C#:.net序列化及反序列化[XmlElement(“节点名称”)][XmlAttrib。

.NET Framework 开发员指南序列化是将对象转换为容易传输的格式的过程。

例如,可以序列化⼀个对象,然后使⽤ HTTP 通过 Internet 在客户端和服务器之间传输该对象。

在另⼀端,反序列化将从该流重新构造对象。

XML 序列化仅将对象的公共字段和属性值序列化为 XML 流。

XML 序列化不包括类型信息。

例如,如果您有⼀个存在于 Library 命名空间中的 Book 对象,将不能保证它将会被反序列化为同⼀类型的对象。

注意 XML 序列化不转换⽅法、索引器、私有字段或只读属性(只读集合除外)。

若要序列化对象的所有字段和属性(公共的和私有的),请使⽤,⽽不要使⽤ XML序列化。

XML 序列化中最主要的类是类,它的最重要的⽅法是 Serialize 和 Deserialize ⽅法。

XmlSerializer ⽣成的 XML 流符合万维⽹联合会 () XML 架构定义语⾔ (XSD)1.0 的建议。

另外,⽣成的数据类型符合标题为“XML Schema Part 2: Datatypes”(XML 架构第⼆部分:数据类型)的⽂档。

对象中的数据是⽤编程语⾔构造(如类、字段、属性、基元类型、数组,甚⾄ XmlElement 或 XmlAttribute 对象形式的嵌⼊ XML)来描述的。

您可以创建⾃⼰的⽤属性批注的类,或者使⽤ XML 架构定义⼯具⽣成基于现有 XML 架构的类。

如果您有 XML 架构,就可运⾏ XML 架构定义⼯具⽣成⼀组强类型化为架构并⽤属性批注的类。

当序列化这样的类的实例时,⽣成的 XML 符合 XML 架构。

使⽤这样的类,就可针对容易操作的对象模型进⾏编程,同时确保⽣成的 XML 符合 XML 架构。

这是使⽤ .NET Framework 中的其他类(如 XmlReader 和 XmlWriter 类)分析和写 XML 流的⼀种替换⽅法。

在NETFramework中轻松处理XML数据

在NETFramework中轻松处理XML数据

在.NET Framework中轻松处理XML数据(一> /school · 2005-01-17 12:40:21 · 来源: 0在.NET Framework中,XmlTextReader和XmlTextWriter类提供了对xml数据的读和写操作。

在本文中,作者讲述了XML阅读器(Reader>的体系结构及它们怎样与XMLDOM 和SAX 解释器结合。

作者也演示了怎么样运用阅读器分析和验证XML文档,怎么样创建格式良好的XML文档,以及怎么样用函数读/写基于Base64和BinHex编码的大型的XML文档。

最后,作者讲了怎么样实现一个基于流的读/写分析器,它把读写器都封装在一个单独的类里。

大概三年前,我参加了一个软件研讨会,主题是“没有XML,就没有编程的未来”。

XML确实也在一步一步的发展,它已经嵌入到. NET Framework中了。

在本文中,我将讲解. NET Framework中用于处理XML文档的API的角色和它的内部特性,然后我将演示一些常用的功能。

从MSXML到.net的XML在. NET Framework出现之前,你习惯使用MSXML服务----一个基于COM的类库---写windows的XML的驱动程序。

不像. NET Framework中的类,MSXML类库的部分代码比API更深,它完全的嵌在操作系统的底层。

MSXML的确能够与你的应用程序通信,但是它不能真正的与外部环境结合。

MSXML类库能在win32中被导入,也能在CLR中运用,但它只能作为一个外部服务器组件使用。

但是基于.NET Framework的应用程序能直接的用XML类与.NET Framework 的其它命名空间整合使用,并且写出来的代码易于阅读。

作为一个独立的组件,MSXML分析器提供了一些高级的特性如异步分析。

这个特性在.NET Framework中的XML类及.NET Framework的其它类都没有提供,但是,NET Framework中的XML类与其它的类整合可以很轻易的获得相同的功能,在这个基础上你可以增加更多的功能。

XML序列化

XML序列化

XML序列化.NET框架提供的一种形式的序列化是XML序列化。

在这种类型的序列化里,对象状态被以XML格式保存。

这使得被序列化的对象能够被不同的系统取得并修改,甚至是那些不是用.NET编写的系统。

另外一个优势是被序列化的对象对于人来说是可读和可写的——因此更新对象的方式莫过于打开写字板更改其值。

XML序列化常常被来远程控制项目和Web服务项目里,虽然你可能会在别的地方发现它,比如DataSet封送。

在与Xpath查询和Predicate方法一起使用的时候,XML序列化能够被用来实现面向对象的数据库。

使用XML序列化在.NET框架里利用内置的XML序列化方法相对较为容易。

你只需要熟悉一些类和属性就可以开始使用简单的XML序列化了:System.Xml.Serialization命名空间:含有使用XML序列化所需要的类和功能。

这个命名空间应该被放在使用XML序列化的类的顶部的一个“using”命令里。

XmlSerializer类:提供将对象序列化和反序列化的功能。

XmlIgnore属性:告诉XmlSerializer类跳过你不希望序列化的成员。

这个列表只不过让你对序列化有一个初步的了解。

还有更多的对象可以供你在使用XML序列化的时候使用。

列表A是将Customer对象序列化的一个简单例子。

这个Customer对象在下载文件的示例应用程序里被定义。

列表A1.Customer customer = newCustomer();2.customer.FirstName = "Zach";stName = "Smith";4.XmlSerializer serializer = newXmlSerializer(typeof(Customer));5.StringWriter writer = newStringWriter();6.serializer.Serialize(writer, customer);7.Console.WriteLine(writer.ToString());复制代码正如你看到的,XML序列化是一个很简单的过程。

C#.netXML的序列化与反序列化

C#.netXML的序列化与反序列化
using (StreamReader sr = new StreamReader(ms, encialize(sr); } } }
summary从xml字符串中反序列化对象summarytypeparamnamet结果对象类型typeparamparamnamexmlstring包含对象的xml字符串paramparamnameencoding编码方式paramreturns反序列化得到的对象returnspublicstatictdeserializeobjecttstringxmlstringencodingencodingifstringisnulloremptyxmlstringthrownewargumentnullexceptions
C#.netXML的 序 列 化 与 反 序 列 化
/// <summary> /// 将一个对象序列化为XML字符串 /// </summary> /// <param name="o">要序列化的对象</param> /// <param name="encoding">编码方式</param> /// <returns>序列化产生的XML字符串</returns> public static string SerializeObject(object o, Encoding encoding) { if (o == null) { throw new ArgumentNullException("o"); } if (encoding == null) { throw new ArgumentNullException("encoding"); } using (MemoryStream stream = new MemoryStream()) { XmlSerializer serializer = new XmlSerializer(o.GetType()); XmlWriterSettings settings = new XmlWriterSettings(); settings.Indent = true; settings.NewLineChars = "\r\n"; settings.Encoding = encoding; settings.IndentChars = " "; using (XmlWriter writer = XmlWriter.Create(stream, settings)) { serializer.Serialize(writer, o); writer.Close(); } stream.Position = 0; using (StreamReader reader = new StreamReader(stream, encoding)) { return reader.ReadToEnd(); } } }

.NET中XML序列化和反序列化常用类和属性小结

.NET中XML序列化和反序列化常用类和属性小结

.NET中XML序列化和反序列化常⽤类和属性⼩结⽬录序列化和反序列化是指什么?XmlSerializer类.NET-XML序列化和反序列化简单⽰例代码XmlTypeAttribute类应⽤⽰例XmlElementAttribute类应⽤⽰例XmlAttributeAttribute类应⽤⽰例XmlArrayAttribute类应⽤⽰例XmlTextAttribute类应⽤⽰例XmlIgnoreAttribute类应⽤⽰例⽤来控制XML序列化的属性汇总参考⽂章序列化和反序列化是指什么?序列化(seriallization):将对象转化为便于传输的数据格式,常见的序列化格式:⼆进制格式,字节数组,json字符串,xml 字符串。

反序列化(deseriallization):将序列化的数据恢复为对象的过程。

XmlSerializer类 该类⽤⼀种⾼度松散耦合的⽅式提供串⾏化服务。

你的类不需要继承特别的基类,⽽且它们也不需要实现特别的接⼝。

相反,你只需在你的类或者这些类的公共域以及读/写属性⾥加上⾃定义的特性。

XmlSerializer通过反射机制读取这些特性并⽤它们将你的类和类成员映射到xml元素和属性(在对象和 XML ⽂档之间进⾏序列化和反序列化操作)。

.NET-XML序列化和反序列化简单⽰例代码using System.IO;using System.Xml.Serialization;namespace mon{public class SimpleSerializer{/// <summary>/// Model实体对象序列化为XML字符串/// </summary>/// <typeparam name="T">对象类型</typeparam>/// <param name="t">Model实体对象</param>/// <returns></returns>public static string SerializeXMLL<T>(T t){using (StringWriter sw = new StringWriter()){XmlSerializer xmlSerializer = new XmlSerializer(t.GetType());xmlSerializer.Serialize(sw, t);return sw.ToString();}}/// <summary>/// XML反序列化为对象/// </summary>/// <typeparam name="T">对象类型</typeparam>/// <param name="xml">xml字符串</param>/// <returns></returns>public static T Deserialize<T>(string xml){XmlSerializer xmlSerializer = new XmlSerializer(typeof(T));StringReader stringReader = new StringReader(xml);return (T)xmlSerializer.Deserialize(stringReader);}}}XmlTypeAttribute类 该类主要控制当属性⽬标由XML序列化时⽣成的XML节点。

.Net读取配置文件xml

.Net读取配置文件xml

.Net读取配置⽂件xml直接解析XML⽂件在直接读取⽂件的时候由于⼿动getAttribute很⿇烦,⽽且容易出错,attribute可以参考log4net的⽅式,全部做成宏定义:使⽤.Net提供的的⽅式(ConfigurationManager类,⽀持.Net Core 2)特别说明:using System.Configuration 之后可能还要⼿动勾选,如下图:使⽤.Net 提供的⽅法读取有时候会很⽅便,可以直接将配置信息填写在app.config ⽂件中例如下⾯的配置⽂件读取的时候:<?xml version="1.0" encoding="utf-8" ?><configuration><startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" /></startup><appSettings><add key="name" value="kun"/><add key="name2" value="kun"/></appSettings><connectionStrings><add name="WingtipToys" connectionString="Data Source=(LocalDB)\v11.0;Initial Catalog=WingtipToys;Integrated Security=True;Pooling=False" /> </connectionStrings></configuration>static void ReadAllSettings(){try{var appSettings = ConfigurationManager.AppSettings;if (appSettings.Count == 0){Console.WriteLine("AppSettings is empty.");}else{foreach (var key in appSettings.AllKeys.Where((key) => key == "name")){Console.WriteLine("Key: {0} Value: {1}", key, appSettings[key]);}}}catch (ConfigurationErrorsException){Console.WriteLine("Error reading app settings");}}static void ReadSetting(string key){try{var appSettings = ConfigurationManager.AppSettings;string result = appSettings[key] ?? "Not Found";Console.WriteLine(result);}catch (ConfigurationErrorsException){Console.WriteLine("Error reading app settings");}}读取数据库连接信息也可以只⽤⼀句代码:var connectionString = ConfigurationManager.ConnectionStrings["WingtipToys"].ConnectionString;对于这种简单key/Value⽅式的配置,使⽤ConfigurationManager类还是很⽅便的。

C#XML序列化反序列化参考

C#XML序列化反序列化参考

C#XML序列化反序列化参考.NET提供了很不错的XML序列化/反序列化器,(它们所在的命名空间为System.Xml.Serialization)这是很⽅便的,下⾯对它的使⽤做⼀些总结,以供参考。

1,简单序列化public static string SerializeXml(object data) {using (StringWriter sw = new StringWriter()) {XmlSerializer xz = new XmlSerializer(data.GetType());xz.Serialize(sw, data);return sw.ToString();}}以上代码是序列化为字符串,如果需要以流的形式返回序列化结果给客户端,或写⼊⽂件,那么通常需要选择⼀种编码,常见的编码格式是UTF-8,但某些特殊场合也许你会被要求使⽤GB2312编码,下⾯例⼦是使⽤GB2312编码的情况:public static MemoryStream SerializeXml(object data) {MemoryStream ms = new MemoryStream();StreamWriter sw = new StreamWriter(ms, Encoding.GetEncoding("GB2312"));XmlSerializer xz = new XmlSerializer(data.GetType());xz.Serialize(sw, data);return ms;}这样就直接把对象以特定编码格式序列化到MemoryStream⾥去了,当然也许你想到了,先使⽤前⾯的SerializeXml⽣成字符串,再把字符串以特定编码格式写到流或者字节数组中去不⾏吗?当然⾏,不过这样会多出⼀步,不够直接。

这⾥还有个要注意的地⽅,序列化到流的时候,不要对Stream及TextWriter对象包在using⾥,因为这样会导致流返回的时候已经被关闭。

XML序列化和反序列化

XML序列化和反序列化

XML序列化和反序列化在谈XML序列化之前,我们先来说说序列化。

为什么要做序列化和反序列化?.Net程序执⾏时,对象都驻留在内存中;内存中的对象如果需要传递给其他系统使⽤;或者在关机时需要保存下来以便下次再次启动程序使⽤就需要序列化和反序列化。

序列化名词解释:序列化是将对象状态转换为可保持或传输的格式的过程。

与序列化相对的是反序列化,它将流转换为对象。

这两个过程结合起来,可以轻松地存储和传输数据。

这就是序列化的意义所在。

我们可以把对象序列化为不同的格式,⽐如说,Json序列化、XML序列化、⼆进制序列化、SOAP序列化等,以上这些不同的格式也都是为了适应具体的业务需求。

在本篇⽂章中,我们就来分析⼀下XML的序列化和反序列化。

我们先来看⼀个XML⽂件:123 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27<?xml version="1.0" encoding="utf-8" ?> <BaseInfo><Person><Name>⼩明</Name><Age>16</Age><Books><Book><ISBN>123</ISBN><Title>借的书1</Title></Book></Books></Person><Person><Name>⼩红</Name><Age>18</Age><Books><Book><ISBN>456</ISBN><Title>借的书2</Title></Book><Book><ISBN>789</ISBN><Title>借的书3</Title></Book></Books></Person></BaseInfo>在这个⽂件中BaseInfo为该XML的跟节点,它的⾥⾯由多个Person节点组成,在Person节点中⼜包括Name、Age、Books节点,Books节点中⼜由多个Book组成,在Book中⼜包括ISBN和Title。

net中对象序列化技术浅谈

net中对象序列化技术浅谈

序列化是将对象转换为容易传输的格式的过程。

例如,可以序列化一个对象,然后使用HTTP 通过Internet 在客户端和服务器之间传输该对象。

反之,反序列化根据流重新构造对象。

在.net中有提供了几种序列化的方式:二进制序列化XML序列化SOAP序列化二进制序列化所谓二进制序列化,指的是对象序列化之后是二进制形式的。

二进制序列化是通过Binary Formatter类来实现的,这个类位于System.Runtime.Serialization.Formatters.Bina ry命名空间下。

XML序列化所谓XML序列化,是指对象序列化之后的结果是XML形式的。

保存XML序列化是通过X mlSerializer 类来实现的,这个类位于System.Xml.Serialization命名空间下。

SOAP序列化所谓SOAP序列化是指对象序列化之后的结果符合SOAP协议,也就是可以通过SOAP协议传输(不知道SOAP协议?百度一下吧)。

SOAP序列化是通过SoapFormatter类来实现的,这个类位于System.Runtime.Serialization.Formatters.Soap命名空间下,并且需要注意需要手动添加对这个命名空间的引用,如下图所示:下面编写一个类用于序列化和反序列化,这个类的代码如下:ing System;ing System.Collections.Generic;ing System.Text;4.space MySerializeDemo6.{7. [Serializable]8. /// <summary>9. /// 要序列化的对象10. /// 作者:周公11. /// 编写时间:2009-03-1012. /// </summary>13. public class MyObject14. {15. //[NonSerialized]16. private string name;17. private DateTime birthday;18. private string homePlace;19. /// <summary>20. /// 出生地21. /// </summary>22. public string HomePlace23. {24. get { return homePlace; }25. set { homePlace = value; }26. }27.28. /// <summary>29. /// 生日30. /// </summary>31. public DateTime Birthday32. {33. get { return birthday; }34. set { birthday = value; }35. }36.37. /// <summary>38. /// 姓名39. /// </summary>40. public string Name41. {42. get { return name; }43. set { name = value; }44. }45.46. /// <summary>47. /// 年龄48. /// </summary>49. public int Age50. {51. get { return DateTime.Now.Year - birthday.Year; }52. }53. /// <summary>54. /// override了ToString()方法55. /// </summary>56. /// <returns></returns>57. public override string ToString()58. {16. MyObject obj = new MyObject();17. obj.Birthday = new DateTime(1979, 11, 7);18. obj.HomePlace = "湖北";19. = "周公";20. Console.WriteLine("========使用BinaryFormatter类进行序列化和反序列化。

XML序列化与反序列化 - 整理文档

XML序列化与反序列化 - 整理文档

XML序列化与反序列化整理文档XML序列化与反序列化// OBJECT -> XMLpublic static void SaveXml(string filePath, object obj) { SaveXml(filePath, obj, obj.Ge tType()); }public static void SaveXml(string filePath, object obj, System.Type type){using (System.IO.StreamWriter writer = new System.IO.StreamWriter(filePath)) {System.Xml.Serialization.XmlSerializer xs = new System.Xml.Serialization.XmlSe rializer(type);xs.Serialize(writer, obj);writer.Close();}}// XML -> OBJECTpublic static object LoadXml(string filePath, System.Type type){if (!System.IO.File.Exists(filePath))return null;using (System.IO.StreamReader reader = new System.IO.StreamReader(filePath)) {System.Xml.Serialization.XmlSerializer xs = new System.Xml.Serialization.XmlSe rializer(type);object obj = xs.Deserialize(reader);reader.Close();return obj;}}相关的常用Attribute(命名空间System.Xml.Serialization )[XmlRootAttribute("PurchaseOrder", Namespace="/", IsNullable =false)] // 指定根[XmlIgnoreAttribute] // 跳过不序列化[XmlArrayAttribute("Items")] public OrderedItem[] OrderedItems; //层次序列化: <Items><OrderedItem.../><OrderedItem.../>..</Items>[XmlElementAttribute(ElementName="Link", IsNullable=false)] public Link[] Links; // 平面序列化: <Link ..../><Link .../>...[XmlAttribute("Cat")] public string Cat; // 表现为属性<... Cat=.. />[XmlElementAttribute(IsNullable=false)] // 表现为节点<Cat>..</cat>相关的全部Attribute(命名空间System.Xml.Serialization )XmlAttributes 表示一个特性对象的集合,这些对象控制XmlSerializer 如何序列化和反序列化对象。

newtonsoft deserializeobject xml

newtonsoft deserializeobject xml

newtonsoft deserializeobject xmlNewtonsoft是一个广受欢迎的.NET框架,提供了许多功能强大的工具和库。

其中,Newtonsoft.Json库是处理JSON格式的数据的最佳选择。

但是,如果我们需要处理XML格式的数据,我们该怎么办呢?这时,就需要使用Newtonsoft的另一款工具——DeserializeObject。

Newtonsoft的DeserializeObject是将XML格式的数据转换成.NET对象的工具。

它可以将XML数据序列化为.NET对象,让我们可以轻松地在.NET应用程序中处理和使用它们。

首先,我们需要安装Newtonsoft.Json库。

这可以通过NuGet包管理器轻松完成。

在Visual Studio中,选择“工具”菜单中的“NuGet 包管理器”,然后搜索“Newtonsoft.Json”。

点击“安装”按钮,即可安装该库。

接下来,我们需要创建一个包含XML数据的字符串,作为DeserializeObject的输入。

可以手动编写这个字符串,或者从文件或API中获取。

然后,我们需要定义一个.NET类,该类的属性与XML数据中的元素相对应。

例如,如果XML数据中有一个名为“person”的元素,该元素包含名为“name”和“age”的子元素,那么我们可以定义一个名为“Person”的.NET类,该类包含名为“Name”和“Age”的属性。

接下来,使用DeserializeObject将XML字符串转换为.NET对象。

在这个过程中,Newtonsoft会自动将XML数据中的元素与.NET 类中的属性匹配,从而创建一个.NET对象,其中包含了XML数据中的所有信息。

将.NET对象用于进一步的操作,就像处理其他.NET对象一样。

总之,Newtonsoft的DeserializeObject是一个非常有用的工具,它允许我们轻松地将XML数据转换为.NET对象,并在.NET应用程序中使用它们。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

NET使XML串行化易如反掌人们一直高喊XML是解决系统互联问题的关键, 而.NET framework 也为处理XML数据提供了许多不同的类库. XmlDocument 类能让你像处理文件一样处理XML 数据, 而XmlReader, XmlWriter, 和它们的派生类使你能够将XML 数据做为数据流处理. XmlSerializer 则提供了另外的方法, 它使你能够将自己的对象串行和反串行化为XML. 串行化数据既能够让你像处理文件一样对数据进行随机存取, 同时又能够跳过你不感兴趣的元素. 在本文中, 我将向你展示如何使用XmlSerializer类以及如何在你的类中添加属性来控制串行化过程.XmlSerializerXmlSerializer类存在于System.Xml.Serialization命名空间的System.Xml.dll中, 它用一种高度松散耦合的方式提供串行化服务. 你的类不需要继承特别的基类, 而且它们也不需要实现任何特别的接口. 相反的, 你只需要在你的类或者这些类的公共域以及读/写属性里加上自定义的属性. XmlSerializer 通过相反映射读取这些属性并用它们将你的类和类成员映射到XML元素和属性.将XML 映射到对象考虑表A中的XML语句, 哪一个正确的描述了一家电影院中上映的电影呢?表A<?xml version="1.0" encoding="utf-8" ?><theater><name>The Camelot</name><phone>(888)665-2222</phone><movie minutes="120" stars="2"><title>The Score</title><rating>R</rating><showing>16:15:00</showing><showing>19:05:00</showing><showing>21:40:00</showing></movie><movie minutes="100"><title>Shrek</title><rating>PG-13</rating><showing>16:00:00</showing><showing>19:00:00</showing><showing>21:40:00</showing></movie></theater>表B中定义了一个Theater(电影院)类, 它包含了XmlSerializer使用的属性映射.表Busing System;using System.Xml.Serialization;namespace Articles.TechRepublic.XmlSerialization{[XmlRoot( "theater" )]public class Theater{[XmlElement( "name" )]public string Name = "";[XmlElement( "phone" )]public string Phone = "";[XmlElement( "movie" )]public Movie[] Movies;public override string ToString(){string movies = "";if ( Movies != null )foreach ( Movie movie in Movies )movies += "\n" + movie.ToString();return String.Format( "{0}\n {1}\n{2}",Name, Phone, movies );}}XmlRoot 属性将类Theater映射到XML的根元素theater. XmlElement 属性将Name, Phone, 和Movies数据域映射到嵌套在theater元素中的name, phone, 和movie XML元素上去. 因为Movies是Movie数组, 所以XmlSerializer将它映射到多个XML movie元素.表C展示了一个带有属性映射的Movie类表Cpublic class Movie{[XmlElement( "title" )]public string Title = "";[XmlAttribute( "minutes" )]public uint Minutes = 0;[XmlElement( "showing", DataType="time" )]public DateTime[] Showings;public override string ToString(){string showings = "";if ( Showings != null ){showings = "shows at ";foreach ( DateTime showing in Showings )showings += showing.ToShortTimeString() + " "; }else{showings = "- No showings";}return String.Format( " {0} ({1} min) {2}",Title, Minutes, showings );}}XmlElement 属性将Title和Showings数据域映射到movie 元素内的title 和showing XML元素.就象Theater.Movie一样, 做为DateTime数组的Movie.Showings 被映射到多个XML showing 元素. showing 数据域的属性包括位置属性参数DataType="time". 它将DateTime值映射到一个XML time值, 其间去掉了日期信息而只保留了时间信息. XmlAttribute 属性将Minutes 数据域映射到XML属性而不是XML元素.XML数据中的moviestars(影星)属性和rating(上座率)元素没有被映射到Movie类中的任何东西上去. 当反串行化XML数据的时候, XmlSerializer只是简单的跳过它不能映射的项目. 当串行化一个对象的时候, 你可以在公共数据域和你希望XmlSerializer跳过的属性里加上XmlIgnore 属性.XmlRoot, XmlElement, 和XmlAttribute的属性类都应包括后缀"Attribute." 在我的属性申明里, 我使用了没有后缀的缩写形式. Theater和Movie类中的公共属性可以被改写成公共属性以求得更好的封装性. XmlSerializer 可以用相同的方式使用它们. 我在这里将它们做为数据域使用是为了使代码更紧凑.将XML数据反串行化成对象将XML数据加载到一个Theater对象里现在已经变得非常容易. 表D中的程序, XmlIn, 通过反串行化movie showings XML 数据创建一个Theater对象. 这个程序通过命令行执行, 你需要指明一个输入的XML文件.表Dusing System;using System.Xml.Serialization;using System.IO;using Articles.TechRepublic.XmlSerialization;public class XmlIn{public static void Main( string[] args ){if ( args.Length != 1 ){Console.WriteLine( "Usage: XmlIn infile.xml" );return;}try{// Deserialize the specified file to a Theater object. XmlSerializer xs = new XmlSerializer( typeof ( Theater ) );FileStream fs = new FileStream( args[0], FileMode.Open );Theater theater = (Theater)xs.Deserialize( fs );// Display the theater object.Console.WriteLine ( theater );}catch ( Exception x ){Console.WriteLine( "Exception: " + x.Message ); }}}Output:>XmlIn theaterIn.xmlThe Camelot(888)665-2222The Score (120 min) shows at 4:15 PM 7:05 PM 9:40 PM Shrek (100 min) shows at 4:00 PM 7:00 PM 9:40 PM主要的程序代码都放在Main 函数的try代码段里. 首先创建一个XmlSerializer对象并指明一个System.Type 对象来告诉反串行化程序要创建的对象的类型. typeof操作符为Theater类返回一个System.Type 对象. 然后, 打开一个文件流读取输入的XML文件. 调用XmlSerializer的Deserialize方法, 并把文件流传递给它. Deserialize 返回对Theater对象的引用. Theater和Movie 对象中的ToString方法能够让你简单的输出它们.将对象串行化到XML里从一个Theater对象生成XML数据同样是容易的. 表E中的程序,XmlOut, 就是将一个Theater对象串行化到XML 文件里. 这个程序通过命令行执行, 你需要指明输出的XML文件.表Eusing System;using System.Xml;using System.Xml.Serialization;using System.IO;using Articles.TechRepublic.XmlSerialization;public class XmlOut{// Returns a populated Theater object.public static Theater GetTheater(){Movie movie = new Movie();movie.Title = "O Brother, Where Art Thou?";movie.Minutes = 102;movie.Showings = new DateTime[3];movie.Showings[0] = new DateTime( 2001, 8, 2, 13, 15, 0 );movie.Showings[1] = new DateTime( 2001, 8, 2, 16, 30, 0 );movie.Showings[2] = new DateTime( 2001, 8, 2, 19, 55, 0 );Theater theater = new Theater(); = "Hollywood Movies 10";theater.Phone = "(972)555-154";theater.Movies = new Movie[1];theater.Movies[0] = movie;return theater;}public static void Main( string[] args ){if ( args.Length != 1 ){Console.WriteLine( "Usage: XmlOut outfile.xml" ); return;}try{Theater theater = GetTheater();// Serialize the Theater object to an XML file.XmlSerializer xs = new XmlSerializer( typeof ( Theater ) );FileStream fs = new FileStream( args[0], FileMode.Create );xs.Serialize( fs, theater );}catch ( Exception x ){Console.WriteLine( "Exception: " + x.Message ); }}}Invocation:>XmlOut theaterOut.xmltheaterOut.xml contents:<?xml version="1.0"?><theaterxmlns:xsi=/2001/XMLSchema-instance xmlns:xsd="/2001/XMLSchema"><name>Hollywood Movies 10</name><phone>(972)555-154</phone><movie minutes="102"><title>O Brother, Where Art Thou?</title><showing>13:15:00.0000000-06:00</showing><showing>16:30:00.0000000-06:00</showing><showing>19:55:00.0000000-06:00</showing></movie></theater>主要的程序代码都放在Main 函数的try代码段里. 首先通过GetTheater帮助函数创建一个Theater对象. 然后, 打开一个文件流来生成输出的XML 文件. 调用XmlSerializer的Serialize方法, 传递给它文件流和Theater对象. 就是这样简单--XML文件生成了!输出的theater 元素包含了为模板和模板实例命名空间生成的XML命名空间属性(xmlns), 虽然在这两个命名空间里这些数据并不代表任何东西. showing元素中的-06:00 指的是美国中部时间, 或者说GMT时间再减去个小时, 也就是我所在的时区.移动数据是小菜一碟XmlSerializer 使得在对象和XML间移动数据变得非常容易, 只要在类里加上XML映射属性. 但是对于更复杂的对象模型, 手工的创建XML映射会变得非常的麻烦而且容易出错. 在我的下一篇文章里, 我将告诉你如何自动化这个工作并实现对你的XML数据的更严格的控制.。

相关文档
最新文档