参考http://www.cnblogs.com/fish-li/archive/2013/05/05/3061816.html

我们可以直接使用XmlTextReader、XmlDocument、XPath来取数XML中的数据, 也可以使用LINQ TO XML或者反序列化的方法从XML中读写数据,我各人比较喜欢序列化、反序列化方法。

1、默认情况下,不添加任何属性标签的对象属性都序列化为一个节点。如下一个Student对象序列化结果如下:

public class Student
{
public string Name { get; set; }//属性无任何修饰都序列化为Element public string Sex { get; set; } public int Age { get; set; }
}
Student stu = new Student()
{
Name = "LiLei",
Age = ,
Sex = "男"
};
string xml= XmlHelper.XmlSerialize(stu, Encoding.UTF8);//序列化

序列化结果如下:

<?xml version="1.0" encoding="utf-8"?>
<Student xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<Name>LiLei</Name>
<Sex>男</Sex>
<Age>25</Age>
</Student>

2、使用XmlAttribute修饰类属性,则对应属性序列化为节点属性

using System.Xml.Serialization;

namespace Entity
{
public class Student
{
[XmlAttribute]
public string Name { get; set; }
[XmlAttribute]
public string Sex { get; set; }
[XmlAttribute]
public int Age { get; set; }
}
} Student stu = new Student()
{
Name = "LiLei",
Age = ,
Sex = "男"
};
string xml= XmlHelper.XmlSerialize(stu, Encoding.UTF8);

序列化结果:

<!--被XmlAttribute修饰的类属性都序列化为Xml节点属性-->
<?xml version="1.0" encoding="utf-8"?>
<Student xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" Name="LiLei" Sex="男" Age="25" />

3、使用XmlText修饰为xml节点InnerText

public class Student
{
[XmlText]
public string Name { get; set; } [XmlAttribute]
public string Sex { get; set; } [XmlAttribute]
public int Age { get; set; }
} Student stu = new Student()
{
Name = "LiLei",
Age = ,
Sex = "男"
};
string xml= XmlHelper.XmlSerialize(stu, Encoding.UTF8);

序列化结果

<?xml version="1.0" encoding="utf-8"?>
<Student xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" Sex="男" Age="25">
  LiLei
</Student>

4、重命名

属性:[XmlAttribute("别名")]

元素节点:[XmlElement("别名")]

列表元素节点:[XmlArrayItem("别名")]

列表元素自身:[XmlArray("别名")]

类型即根节点:[XmlType("别名")]或[XmlRoot("别名")]

[XmlType("Stu")]
public class Student
{
[XmlElement("Name")]//重命名为Name
public string StudentName { get; set; } [XmlAttribute("Sex")]//重命名为Sex
public string StudentSex { get; set; } [XmlAttribute]
public int Age { get; set; }
}
Student stu = new Student()
{
StudentName = "LiLei",
Age = ,
StudentSex = "男"
};
string xml= XmlHelper.XmlSerialize(stu, Encoding.UTF8);

序列化结果:

<Stu xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" Sex="男" Age="25">
<Name>LiLei</Name>
</Stu>

5、列表和数组在序列

例如:
public class Student
{
[XmlElement("Name")]
public string StudentName { get; set; } [XmlAttribute("Sex")]
public string StudentSex { get; set; } [XmlAttribute]
public int Age { get; set; }
}
List<Student> stu_list = new List<Student>() {
new Student() { StudentName = "Lily", Age = , StudentSex = "女" },
new Student() { StudentName = "Hanmeimei", Age = , StudentSex = "女" },
new Student() { StudentName = "Linda", Age = , StudentSex = "女" },
}; string xml = XmlHelper.XmlSerialize(stu_list, Encoding.UTF8);

序列化xml结果为:

<?xml version="1.0" encoding="utf-8"?>
<ArrayOfStudent xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<Student Sex="女" Age="19">
<Name>Lily</Name>
</Student>
<Student Sex="女" Age="21">
<Name>Hanmeimei</Name>
</Student>
<Student Sex="女" Age="19">
<Name>Linda</Name>
</Student>
</ArrayOfStudent>

该结果的根节点显然不大友好,为此可以重新定义一个新类型,例如:

[XmlRoot("Students")]
public class StudentList : List<Student> { } StudentList stulist = new StudentList() {
new Student() { StudentName = "Lily", Age = , StudentSex = "女" },
new Student() { StudentName = "Hanmeimei", Age = , StudentSex = "女" },
new Student() { StudentName = "Linda", Age = , StudentSex = "女" }
}; string xml = XmlHelper.XmlSerialize(stulist, Encoding.UTF8);

序列化为Xml结果如下:

<?xml version="1.0" encoding="utf-8"?>
<Students xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<Student Sex="女" Age="19">
<Name>Lily</Name>
</Student>
<Student Sex="女" Age="21">
<Name>Hanmeimei</Name>
</Student>
<Student Sex="女" Age="19">
<Name>Linda</Name>
</Student>
</Students>

6、类成员为数组或列表的序列化

注意:数组和列表都在序列化时,默认情况下会根据类型中的数据成员名称生成一个节点, 列表项会生成子节点,如果要重命名,可以使用[XmlArrayItem]和[XmlArray]来实现。 还可以直接用[XmlElement]控制不生成列表的父节点

例如:

 public class QueClient
{
public string IP { get; set; } public int LocalPort{ get; set; } public List<Queue> Queues { get; set; } } public class Queue
{
[XmlAttribute("Name")]
public string QueueName { get; set; }
[XmlAttribute("Id")]
public string QueueId { get; set; }
[XmlAttribute("Prefix")]
public string QuePrefix { get; set; } } List<Queue> quelist = new List<Queue>()
{
new Queue() {QueueName="金卡",QueueId="A",QuePrefix="A" },
new Queue() {QueueName="普卡",QueueId="B",QuePrefix="B" },
new Queue() {QueueName="葵花卡",QueueId="C",QuePrefix="C" },
};
QueClient queClient = new QueClient() {
IP ="99.12.53.71",
LocalPort =,
Queues =quelist
}; string xml = XmlHelper.XmlSerialize(queClient, Encoding.UTF8);

序列化结果:

<?xml version="1.0" encoding="utf-8"?>
<QueClient xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<IP>99.12.53.71</IP>
<LocalPort>88</LocalPort>
<Queues>
<Queue Name="金卡" Id="A" Prefix="A" />
<Queue Name="普卡" Id="B" Prefix="B" />
<Queue Name="葵花卡" Id="C" Prefix="C" />
</Queues>
</QueClient>

假如QueClient成员Queues(是列表类型)机该列表节点名需重名,即Queues节点与Queue节点需要重名,只需修改QueueClient,如下:

  public class QueClient
{
public string IP { get; set; } public int LocalPort{ get; set; } [XmlArrayItem("Que")]//重命名列表节点名称
[XmlArray("Ques")]//重命名列表根节点名称
public List<Queue> Queues { get; set; } } List<Queue> quelist = new List<Queue>()
{
new Queue() {QueueName="金卡",QueueId="A",QuePrefix="A" },
new Queue() {QueueName="普卡",QueueId="B",QuePrefix="B" },
new Queue() {QueueName="葵花卡",QueueId="C",QuePrefix="C" },
};
QueClient queClient = new QueClient() {
IP ="99.12.53.71",
LocalPort =,
Queues =quelist
}; string xml = XmlHelper.XmlSerialize(queClient, Encoding.UTF8);

序列化结果如下:

<?xml version="1.0" encoding="utf-8"?>
<QueClient xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<IP>99.12.53.71</IP>
<LocalPort>88</LocalPort>
<Ques>
<Que Name="金卡" Id="A" Prefix="A" />
<Que Name="普卡" Id="B" Prefix="B" />
<Que Name="葵花卡" Id="C" Prefix="C" />
</Ques>
</QueClient>

7、类继承与反序列化

列表元素可以是同一种类型,也可以不是同一种类型(某个类型的派生类)

例如:思考如何反序列化

<?xml version="1.0" encoding="utf-8"?>
<XRoot xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<List>
<X1 aa="1" bb="2" />
<X1 aa="3" bb="4" />
<x2>
<cc>ccccccccccccccccc</cc>
<dd>dddddddddd</dd>
</x2>
</List>
</XRoot>

思想:列表里不同类型的继承同一个父类且同时为列表成员指定多个[XmlArrayItem(typeof(XXX))]可实现多种派生类型混在一起输出。最后反序列化结果如下:

using System;
using System.Collections.Generic;
using System.Xml.Serialization; namespace Entity
{
public class XBase { } [XmlRoot("x1")]
public class X1 : XBase
{
[XmlAttribute("aa")]
public String AA { get; set; }
[XmlAttribute("bb")]
public string BB { get; set; } } [XmlType("x2")]
public class X2 : XBase
{
[XmlElement("cc")]
public string CC { get; set; }
[XmlElement("dd")]
public string DD { get; set; }
} public class XRoot
{
[XmlArrayItem(typeof(X1))]//注意此处指出节点类型两个X1,X2
[XmlArrayItem(typeof(X2))]//注意此处指出节点类型两个X1,X2
public List<XBase> List { get; set; }
}
}

例如:反序列化如下xml内容:

<DynamicHelp xmlns="http://msdn.microsoft.com/vsdata/xsd/vsdh.xsd"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://msdn.microsoft.com/vsdata/xsd/vsdh.xsd vsdh.xsd">
<LinkGroup ID="sites" Title="Venus Sites" Priority="1500">
<Glyph Collapsed="3" Expanded="4"/>
</LinkGroup>
<LinkGroup ID="Venus Private Forums" Title="Venus Private Forums" Priority="1400">
<Glyph Collapsed="3" Expanded="4"/>
</LinkGroup>
<LinkGroup ID="ASP.NET Forums" Title="ASP.NET 1.0 Public Forums" Priority="1200">
<Glyph Collapsed="3" Expanded="4"/>
</LinkGroup>
<Context>
<Links>
<LItem URL="http://www.asp.net/venus" LinkGroup="sites">Venus Home Page</LItem>
<LItem URL="http://www.asp.net" LinkGroup="sites">ASP.NET Home Page</LItem>
<LItem URL="http://www.asp.net/Forums/ShowForum.aspx?tabindex=1&amp;ForumID=77"
LinkGroup="Venus Private Forums">General Discussions</LItem>
<LItem URL="http://www.asp.net/Forums/ShowForum.aspx?tabindex=1&amp;ForumID=83"
LinkGroup="Venus Private Forums">Feature Requests</LItem>
<LItem URL="http://www.asp.net/Forums/ShowForum.aspx?tabindex=1&amp;ForumID=78"
LinkGroup="Venus Private Forums">Bug Reports</LItem>
<LItem URL="http://www.asp.net/Forums/ShowForum.aspx?tabindex=1&amp;ForumID=86"
LinkGroup="Venus Private Forums">ASP.NET 2.0 Related issues</LItem>
<LItem URL="http://www.asp.net/Forums/ShowForum.aspx?tabindex=1&amp;ForumID=11"
LinkGroup="ASP.NET Forums">Announcements</LItem>
<LItem URL="http://www.asp.net/Forums/ShowForum.aspx?tabindex=1&amp;ForumID=15"
LinkGroup="ASP.NET Forums">Getting Started</LItem>
<LItem URL="http://www.asp.net/Forums/ShowForum.aspx?tabindex=1&amp;ForumID=18"
LinkGroup="ASP.NET Forums">Web Forms</LItem>
</Links>
</Context>
</DynamicHelp>

反序列化为:

using System.Collections.Generic;
using System.Xml.Serialization; namespace Entity
{
[XmlRoot(Namespace = "http://msdn.microsoft.com/vsdata/xsd/vsdh.xsd")]//注意此处与xml内容一致,xml内容有空间限定时类定义也需添加
public class DynamicHelp
{
[XmlElement]//注意此处
public List<LinkGroup> Groups { get; set; } public Context Context { get; set; }
} public class LinkGroup {
[XmlAttribute]
public string ID { get; set; }
[XmlAttribute]
public string Title { get; set; }
[XmlAttribute]
public int Priority { get; set; } public Glyph Glyph { get; set; }
} public class Glyph
{
[XmlAttribute]
public int Collapsed { get; set; }
[XmlAttribute]
public int Expanded { get; set; }
} public class LItem
{
[XmlAttribute]
public string URL { get; set; }
[XmlAttribute]
public string LinkGroup { get; set; } [XmlText]
public string Title { get; set; }
} public class Context {
public List<LItem> Links { get; set; }
}
}

8、不需要序列化的属性: [XmlIgnore]

 public class QueClient
{
public string IP { get; set; }
public int LocalPort{ get; set; }
[XmlIgnore]
public int LocalPort2{ get; set; }
[XmlElement]
public List<Queue> Queues { get; set; } }

9、指定类成员序列化顺序[XmlElement(Order<= 顺序数字)]

例如:

  public class QueClient
{
[XmlElement(Order =)]//设置序列化顺序
public string IP { get; set; } public int LocalPort{ get; set; } [XmlIgnore]
public int LocalPort2{ get; set; } [XmlElement]
public List<Queue> Queues { get; set; } }

10、序列化去掉命名空间及声明

 private static void XmlSerializeInternal(Stream stream,object obj,Encoding encoding)
{
if (obj == null)
throw new ArgumentNullException("object");
if(encoding==null)
throw new ArgumentNullException("object");
XmlSerializer serializer = new XmlSerializer(obj.GetType()); XmlWriterSettings settings = new XmlWriterSettings();
settings.Indent = true;
settings.NewLineChars = "\r\n";
settings.Encoding = encoding;
settings.IndentChars = " ";
//设置忽略声明空间
settings.OmitXmlDeclaration = true;
// 强制指定命名空间,覆盖默认的命名空间。
XmlSerializerNamespaces namespaces = new XmlSerializerNamespaces();
namespaces.Add(string.Empty, string.Empty); using (XmlWriter writer=XmlWriter.Create(stream, settings))
{
serializer.Serialize(writer, obj,namespaces);
}
}

11、自定义序列化行为

假如如下代码序列化:

    public class TestClass
{
public string StrValue { get; set; } public List<int> List { get; set; }
} public class ClassB1
{
public TestClass Test { get; set; }
} TestClass test = new TestClass {
StrValue = "Fish Li",
List = new List<int> { , , , , }
};
ClassB1 b1 = new ClassB1 { Test = test };
string xmbll = XmlHelper.XmlSerialize(b1, Encoding.UTF8);

序列化结果:

<ClassB1>
<Test>
<StrValue>Fish Li</StrValue>
<List>
<int>1</int>
<int>2</int>
<int>3</int>
<int>4</int>
<int>5</int>
</List>
</Test>
</ClassB1>

但实际需求是序列化为如下:

<ClassB1 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<Test s="Fish Li">1,2,3,4,5</Test>
</ClassB1>

此时只需要对需要特殊序列化的类进行重定义,即该类实现IXmlSerializable重写ReadXml与WriteXml方法

public class TestClass: IXmlSerializable
{
public string StrValue { get; set; } public List<int> List { get; set; } public XmlSchema GetSchema()
{
return null;
} public void ReadXml(XmlReader reader)
{
StrValue = reader.GetAttribute("s");
string numbers = reader.ReadString();
if(string.IsNullOrWhiteSpace(numbers)==false)
List = (from s in numbers.Split(new char[] {','}, StringSplitOptions.RemoveEmptyEntries)
let n = int.Parse(s)
select n).ToList();
} public void WriteXml(XmlWriter writer)
{
writer.WriteAttributeString("s", StrValue);
writer.WriteString(string.Join(",", List.ConvertAll<string>(x => x.ToString()).ToArray()));
}
}

net中序列化读写xml的更多相关文章

  1. 在.net中序列化读写xml方法的总结

    在.net中序列化读写xml方法的总结 阅读目录 开始 最简单的使用XML的方法 类型定义与XML结构的映射 使用 XmlElement 使用 XmlAttribute 使用 InnerText 重命 ...

  2. C#_在.net中序列化读写xml方法的总结

    阅读目录 开始 最简单的使用XML的方法 类型定义与XML结构的映射 使用 XmlElement 使用 XmlAttribute 使用 InnerText 重命名节点名称 列表和数组的序列化 列表和数 ...

  3. (转)在.net中序列化读写xml方法的总结

    阅读目录 开始 最简单的使用XML的方法 类型定义与XML结构的映射 使用 XmlElement 使用 XmlAttribute 使用 InnerText 重命名节点名称 列表和数组的序列化 列表和数 ...

  4. 在.net中序列化读写xml方法的总结--转载过来学习学习

    原文章地址:http://www.cnblogs.com/fish-li/archive/2013/05/05/3061816.html 首先做个大概的总结,XML包括的元素有XmlElement,X ...

  5. 在.net中序列化读写xml方法

    收集XML的写法 XML是一种很常见的数据保存方式,我经常用它来保存一些数据,或者是一些配置参数. 使用C#,我们可以借助.net framework提供的很多API来读取或者创建修改这些XML, 然 ...

  6. C#中XmlTextWriter读写xml文件详细介绍

    XmlTextWriter类允许你将XML写到一个文件中去.这个类包含了很多方法和属性,使用这些属性和方法可以使你更容易地处理XML.为了使用这个类,你必须首先创建一个新的XmlTextWriter对 ...

  7. C#中XmlTextWriter读写xml文件详细介绍(转)

    转自http://www.jb51.net/article/35230.htm   .NET中包含了很多支持XML的类,这些类使得程序员使用XML编程就如同理解XML文件一样简单.在这篇文章中,我将给 ...

  8. UE4使用第三方库读写xml文件

    原文链接:http://gad.qq.com/article/detail/7181031 本文首发腾讯GAD开发者平台,未经允许,不得转载 在游戏开发过程中,读写xml几乎已经成为不可或缺的功能,但 ...

  9. VC 使用msxml6.dll动态链接库中的函数读写XML文件

    VC 使用msxml6.dll动态链接库中的函数读写XML文件 目录 1 引言 2 .dll使用方法 3 常用函数总结 4 实例应用 5 运行效果预览 6 补充说明 7 不足之处 8 更新   引言: ...

随机推荐

  1. python IDE

    提供给开发者 10 款最好的 Python IDE http://www.oschina.net/news/57468/best-python-ide-for-developers vim windo ...

  2. Android APK反编译easy 详解

    在学习Android开发的过程你,你往往会去借鉴别人的应用是怎么开发的,那些漂亮的动画和精致的布局可能会让你爱不释手,作为一个开发者,你可能会很想知道这些效果界面是怎么去实现的,这时,你便可以对改应用 ...

  3. C# 字符串string类型转换成DateTime类型 或者 string转换成DateTime?(字符串转换成可空日期类型)

    在c#中,string类型转换成DateTime类型是经常用到的,作为基本的知识,这里在此做个小结.一般来说可以使用多种方法进行转换,最常用的就是使用Convert.ToDateTime(string ...

  4. mysql常用命令(3)

    一.启动与关闭 1.1 Linux下启动mysql 的命令: a. rpm包安装:service mysqld start b. 源码包安装:/usr/local/mysql/bin/mysqld_s ...

  5. Web Server 配置及上传文件

    第一种方案:从github上面克隆到服务器 1.git上传文件 ( git bash ) ①切换至所要上传的文件夹 cd 文件夹homepage ②告诉系统当前文件夹要进行git管理 git init ...

  6. 不同系统下的回车\r和换行\n,及其历史

    我们平时按下键盘上的‘回车键’,就能实现回车换行[我们在屏幕上所看到的就是光标移到了下一行的开头位置!!ps:不讨论软件实现的特殊功能,如word里的回车智能缩进].因此对这个按键更准确说应该叫做‘回 ...

  7. nginx简单的rewrite配置

    假设当前已存在location /test/,希望配置一个短连接/ts/与之相同,就需要用到rewrite 直接配置到server段 rewrite ^/ts/(.*) /test/$1; 或者放到l ...

  8. 【入门】匈牙利算法+HNOI2006 hero超级英雄

    一.关于匈牙利算法 匈牙利算法是由匈牙利数学家Edmonds提出的,用增广路径求二分图最大匹配的算法. 听起来高端,其实说白了就是: 假设不存在单相思(单身狗偷偷抹眼泪),在一个同性恋不合法的国家里( ...

  9. cas的http配置和rmi远程调用

    1.cas配置http请求(服务端) 1) 解压cas-server-3.4.4-release.zip将modules目录下的cas-server-webapp-3.4.4.war改名称为cas.w ...

  10. CentOS 7 最小化安装的网络配置

    默认的最小化安装CentOS 7系统以后,是没有ipconfig这个命令的,依赖于net-tools工具包. 一.nmtui 这是一个类似于图形化的命令(和setup类似) 通过这个组件窗口可以设置各 ...