参考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. db2实例、数据库、表空间

    创建数据数据库之前必须创建实例,数据库是运行在实例之上的.实例在本质上是由一些后台进程和共享内存组成.实例相当于是数据库的一个容器,可以包含多个数据库,但是一个数据库只能由一个实例进行管理.相当于Wi ...

  2. 【Selenium】3.介绍Selenium IDE

    本文供学习交流之用,没有商业用途,没有盈利. 完全是我自己为督促自己学习而翻译的.翻译的不好,见谅.来源于:http://www.guru99.com/introduction-selenuim-id ...

  3. Android——初探Dagger2依赖注入

    1,在做项目时,经常需要在一个对象里去创建另一个对象的示例,这种行为是产生耦合的常见形式,对于一个大型项目来说,过多的相互依赖会导致代码难以维护,很容易就会碰到修改一个小需求需要大面积的修改各种代码, ...

  4. Linux入门:运行级别解析

    Linux入门:运行级别解析   一.查看当前运行级别 Ubuntu中,runlevel命令 可以查看当前运行级别: CentOS中,who -r 命令查看当前运行级别:   www.2cto.com ...

  5. Python快速建站系列-Part.Five.2-个人主页及文章列表

    |版权声明:本文为博主原创文章,未经博主允许不得转载. 从usercen.html就可以发现我为个人主页设了三个分开的小版面:写文章.个人文章目录.个人资料 所以按顺序Part.Five的第二部分就完 ...

  6. C# 刷新页面浏览次数(点击量)+1

    页面视图: <p class="text-center text-muted">文章来源:@ent.Origin 点击量:@ent.Hits <Script La ...

  7. mysql 配置文件 value

    在xml配置文件中配置数据库utl时,要使用&的转义字符也就是& 例如:<property name="url" value="jdbc:mysql ...

  8. android 蓝牙串口通讯使用简介

    需要的权限 <uses-permission android:name="android.permission.BLUETOOTH" />  <uses-perm ...

  9. Uva 11478 Halum操作

    题目链接:http://vjudge.net/contest/143318#problem/B 题意:给定一个有向图,每条边都有一个权值.每次你可以选择一个结点v和一个整数d,把所有以v为终点的边的权 ...

  10. python(八)内置模块logging/os/time/sys/json/pickle

    模块 在计算机程序的开发过程中,随着程序代码越写越多,在一个文件里代码就会越来越长,越来越不容易维护.为了编写可维护的代码,我们把很多函数分组,分别放到不同的文件里,这样,每个文件包含的代码就相对较少 ...