复习的这几天收获颇多 今天主要复习了一下 Linq To XML 和序列化XML下面我简单的总结一下今天的收获吧!!
首先我要说一个问题 大多数同学看到"Linq" 第一反应的读法是"Lin-Q(拎Q)" 其实不然 正确的读法是"Lin-k(拎K)"
作为一个名专业的"攻城师"(哈哈 的确 程序员就好比是攻打城市的师傅 要不停的各种困难) 首先对于英文单词一定要掌握
当你和别人交流学习的时候 也会显的很专业!
好了 言归正传
先说说什么的XML XML就是后缀是.Xml的文档 类似于HTML文档 也是一种标记语言 但是xml和HTML有着本质上的区别
HTML主要应用于网站的样式(HTML不是今天的重点 这里就不多说了)
XML主要用于保存数据 可以简单的理解为一个微型的、移植性强的数据库
XML主要有以下几个好处
1. 数据结构化 便于计算机去存储 -- 每条数据都包含在一对结点中 特别方便计算机的读取
2. 传输方便、移动方便 处理起开方便 -- 由于是文档的形式 占用的空间非常非常小 只要操作系统有记事本 就能使用XML
3. 可读性强 -- 这里所说的主要是计算机的可读性强 也是数据的结构化 方便计算机的读取
4. 浏览器支持xml文件 -- xml文档可以在不同的浏览器中查看 并且 在浏览器中查看还可以提示错误
XML也有书写规范的 这也是和HTML最大的不同之一了
1. 区分大小写
2. 开头的写法 <?xml version="1.0" encoding="gb2312"?>
3. 属性必须写在双引号中
4. 标签写在<>中
5. 标签可以自定义、甚至可以是中文标签
6. 有且只能有一个根节点
来具体说说XML和HTML的区别吧
1. XML是区分大小写字母的,HTML不区分。
2. 在HTML中,如果上下文清楚地显示出段落或者列表键在何处结尾,那么你可以省略</p>或者</li>之类的结束 标记。在XML中,绝对不能省略掉结束标记。
HTML:<img src="1.jpg"><br><br>
XML:<img src="1.jpg"></img><br/><br/>
3. 在XML中,拥有单个标记而没有匹配的结束标记的元素必须用一个 / 字符作为结尾。这样分析器就知道不用 查找结束标记了。
4. 在XML中,属性值必须分装在引号中。在HTML中,引号是可用可不用的。
5. 在HTML中,可以拥有不带值的属性名。在XML中,所有的属性都必须带有相应的值。
XML文件应用在什么场合呢? 我来举一个例子吧
如果有一份数据 保存在SQLServer数据库中 有一天 由于业务的需要 要将SQLServer数据库中的100w条数据转移到oralce数据库中
理论上一条一条的转移也是可以的 那就需要好长时间了 这个解决方案显然是行不通的
那么这个时候 就要使用到XML文件来保存数据了 可以将SQLServer数据库中的100w条数据序列化为XML文件 然后通过程序 将XMl文件中的数据
反序列化到oralce数据库中 这样就快多了 也方便多了
今天我主要介绍两种生成XML文件的方法:
一种是序列化和反序列化XML
一种是Linq To XML
序列化XML 简单的说就是将对象保存为XML文件的形式
下面来看代码
// 序列化成xml文件
static void Main(string[] args)
{
List<Class> lis = newList<Class>();
lis.Add(newClass("宋方舟1", "男", "1"));
lis.Add(newClass("宋方舟2", "男", "2"));
lis.Add(newClass("宋方舟3", "男", "3"));
lis.Add(newClass("宋方舟4", "男", "4"));
lis.Add(newClass("宋方舟5", "男", "5"));
lis.Add(newClass("宋方舟6", "男", "6"));
// 序列化成xml文件
XmlSerializerxml = new XmlSerializer(typeof(List<Class>));
// 创建流
using(FileStream f = newFileStream(@"C:\Users\宋方舟\Desktop\1.xml",FileMode.Create,FileAccess.Write))
{
xml.Serialize(f,lis);
}
Console.WriteLine("ok");
Console.ReadKey();
}
// 这里一定要加上 [Serializable] 类一定要是public
[Serializable]
public class Class
{
publicClass()
{ }
publicClass(string name, stringgender, string age)
{
this.name= name;
this.gender= gender;
this.age= age;
}
privatestring name;
public string Name
{
get{ return name; }
set{ name = value; }
}
privatestring gender;
public string Gender
{
get{ return gender; }
set{ gender = value; }
}
privatestring age;
public string Age
{
get{ return age; }
set{ age = value; }
}
}
Linq To XML 简单的说就说使用创建对象的方式 动态的添加结点 将数据保存在结点中
下面来看代码
// LinqTo Xml 创建xml
static void Main(string[] args)
{
List<Person> lis = newList<Person>();
lis.Add(newPerson("宋方舟1", "男", "1"));
lis.Add(newPerson("宋方舟2", "男", "2"));
lis.Add(newPerson("宋方舟3", "男", "3"));
lis.Add(newPerson("宋方舟4", "男", "4"));
lis.Add(newPerson("宋方舟5", "男", "5"));
// 创建文档
XDocumentxdoc = new XDocument();
// 创建根结点
XElementxroot = new XElement("Persons");
// 创建字段结点
XElementxPer = new XElement("Per");
xroot.Add(xPer);
// 创建字段中的属性结点
XElementxName = new XElement("Name");
XElementxGender = new XElement("Gender");
XElementxAge = new XElement("Age");
for(int i = 0;i < lis.Count; i++)
{
xName.Value = lis[i].Name;
xGender.Value = lis[i].Gender;
xAge.Value = lis[i].Age;
xPer.Add(xName);
xPer.Add(xGender);
xPer.Add(xAge);
}
// 添加属性
XAttributexatt = new XAttribute("class", "软件班");
xPer.Add(xatt);
xdoc.Add(xroot); // 添加根节点
xdoc.Save(@"C:\Users\宋方舟\Desktop\2.xml"); // 保存
}
// 读xml文件
static void Main(string[] args)
{
stringpath = @"C:\Users\宋方舟\Desktop\2.xml";
XDocumentxdoc = XDocument.Load(path);
// 获得根结点
XElementxele = xdoc.Root;
// 打印出xml文件中的所有内容
Console.WriteLine(xele.ToString());
// 递归遍历结点
Func(xele);
Console.ReadKey();
}
// 递归调用读取结点
static void Func(XElementelenent)
{
// 遍历根结点
foreach(XElement ele inelenent.Elements())
{
// 判断是不是最深层的子节点如果是那么该就点就没有子节点了就打印
if(!ele.HasElements)
{
Console.WriteLine("Tag={0},Name={1}", ele.Name,ele.Value);
Console.WriteLine();
}
Func(ele);
}
}
以上是我对XML的理解 如果有不正确和不合适的地方 还请您指出 方便我改进 万分感谢!!!!