目录
XML文档展示
<?xml version="1.0" encoding="ISO-8859-1"?> //XML声明,定义了XML的版本(1.0)和使用的编码(ISO-8859-1)
<note> //文档的根元素,以及接下来的是其4个子元素
<to>George</to>
<from>John</from>
<heading>Reminder</heading>
<body>Don't forget the metting!</body>
</note> //最后一行定义根元素的结尾
这个XML文档并没有做任何事情。它仅仅是包装在XML标签中的纯粹的信息。
我们需要编写软件或者程序,才能传送、接收和显示出这个文档里所包含的信息
XML操作
- XML指可拓展标记语言,一般会用XML文档来存储游戏当中的数据,比如技能信息、物品信息等
- XML被设计用来传输和存储数据。XML被设计用来结构化、存储以及传输信息
- XML文档形成了一种树结构,其必须包含根元素,该元素是所有其他元素的父元素。
- XML文档中的元素形成了一棵文档树,这棵树从根部开始,并拓展到树的最底端,所有元素均可拥有子元素
XML语法规则
XML元素指的是从(且包括)开始标签直到(且包括)结束标签的部分
- 所有XML元素都必须有关闭标签(结尾必须有 '/ ')
<p>This is a paragraph </p>
- XML标签对大小写敏感,比如两个标签< Letter > 与< letter >
<Message>这是错误的。</message>
<message>这是正确的。</message>
- XML必须正确地嵌套
<b><i>这是错误的。</b></i>
<b><i>这是正确的。</i></b>
- XML文档必须有根元素(根结点)
<root>
<child>
<subchild>...</subchild>
</child>
</root>
- XML的属性值需加引号
<note data=08/08/2008> //错误
<to>George</to>
<from>John</from>
</note>
<note data="08/08/2008"> //正确
<to>Georage</to>
<from>John</from>
</note>
XML命名规则
XML元素必须遵循以下命名规则:
- 名称可以含字母、数字以及其他的字符
- 名称不能以数字或者标点符号开始
- 名称不能以字符 “XML”(或者XML、Xml关键字)开始
- 名称不能包含空格
- 可使用任何名称,没有保留的字词
案例1-xml文档解析
- txt文本文件->设置打开方式为xml文本编辑器
2. 过程
- 创建一个xml文档,写入技能信息
<skills>
<skill>
<id>1</id>
<name lang="cn">天下无双</name> //添加属性,cn表示中文,en表示英文
<damage>120</damage>
</skill>
<skill>
<id>2</id>
<name lang="cn">永恒零度</name>
<damage>90</damage>
</skill>
<skill>
<id>3</id>
<name lang="en">Sword Storm</name>
<damage>200</damage>
</skill>
</skills>
- 创建一个Skill技能类
namespace _050_XML操作
{
/// <summary>
/// 技能类
/// </summary>
class Skill
{
public int Id { get; set; }
public string Name { get; set; }
public string Lang { get; set; }
public int Damage { get; set; }
public override string ToString()
{
return string.Format("Id:{0},Name={1},Lang={2},Damage={3}", Id, Name, Lang, Damage);
}
}
}
- Program类
using System.Xml;
using System.IO;
namespace _050_XML操作
{
class Program
{
static void Main(string[] args)
{
//1.XmlDocument专门用来解析xml文档
XmlDocument xmlDoc = new XmlDocument();
//选择要加载解析的xml文档的名字
//xmlDoc.Load("skillInfo.txt"); //a.传递文件
xmlDoc.LoadXml(File.ReadAllText("skillInfo.txt")); //b.传递字符串(xml格式的)
//xml文档由根节点和子节点组成
//获取第一个结点(也就是根节点)
XmlNode rootNode = xmlDoc.FirstChild;
//2.得到根节点下面子节点的集合
XmlNodeList skillNodeList = rootNode.ChildNodes; //得到当前结点下面所有的子节点
//创建技能的集合,用来存储所有的技能信息
List<Skill> skillList = new List<Skill>();
foreach (XmlNode skillNode in skillNodeList)
{
//3.获取skill结点下面的所有结点(如ID等)
XmlNodeList fieldNodeList = skillNode.ChildNodes;
Skill skill = new Skill(); //创建skill对象
foreach (XmlNode fieldNode in fieldNodeList)
{
switch (fieldNode.Name) //通过name属性可以获取一个结点的名字
{
case "id":
//获取结点内部的文本,并转化为int类型
int id = Int32.Parse(fieldNode.InnerText);
skill.Id = id;
break;
case "name":
string name = fieldNode.InnerText;
skill.Name = name;
//获取属性的集合,name可以访问属性的名字,value可以访问属性的值
skill.Lang = fieldNode.Attributes[0].Value;
break;
case "damage":
int damage = Int32.Parse(fieldNode.InnerText);
skill.Damage = damage;
break;
//default: //在上面所有 case 都不为真时执行一个任务
// Console.WriteLine("无效的数据");
// break;
}
}
skillList.Add(skill);
}
//打印技能信息列表
foreach (Skill skill in skillList)
{
//直接输出对象的话,输出的是所在类名,想输出类里的信息的话需要重写ToString()方法
Console.WriteLine(skill);
}
Console.ReadKey();
}
}
}
案例2-XML解析技能信息
不同处在于节点属性的获取,有两种方法
- XML技能信息
<SkillInfo>
<SkillList>
<Skill
SkillID="20002"
SkillEngName="Smash"
TriggerType="1"
ImageFile="data/gfx/image/gui_icon_skill_000.dds"
AvailableRace="7"
>
<Name>重击</Name>
</Skill>
<Skill
SkillID="20003"
SkillEngName="Hide"
TriggerType="2"
ImageFile="data/gfx/image/gui_icon_skill_001.dds"
AvailableRace="1"
>
<Name>隐身</Name>
</Skill>
<Skill
SkillID="20004"
SkillEngName="Ikari"
TriggerType="3"
ImageFile="data/gfx/image/gui_icon_skill_002.dds"
AvailableRace="1"
>
<Name>怒之翼</Name>
</Skill>
</SkillList>
</SkillInfo>
- Skill技能类
namespace _051_XML文档解析_技能信息
{
class Skill
{
public int Id { get; set; }
public string Name { get; set; }
public string EngName { get; set; }
public int TriggerType { get; set; }
public string ImageFile { get; set; }
public int AvailableRace { get; set; }
public override string ToString()
{
return string.Format("Id:{0},Name:{1},EngName:{2},TriggerType:{3},ImageFile={4},AvailableRace={5}"
, Id, Name, EngName, TriggerType, ImageFile, AvailableRace);
}
}
}
- Porgram类
using System.Xml;
namespace _051_XML文档解析_技能信息
{
class Program
{
static void Main(string[] args)
{
//1.加载xml文档
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load("XML技能信息.txt");
//2.获取所有的子节点
XmlNode skillListNode = xmlDoc.FirstChild.FirstChild;
XmlNodeList skillNodeList = skillListNode.ChildNodes;
//创建对象集合
List<Skill> skillList = new List<Skill>();
//3.获取节点下的属性
foreach (XmlNode skillNode in skillNodeList)
{
Skill skill = new Skill();
//a.通过字符串索引,获取子节点这个元素
XmlElement ele = skillNode["Name"];
skill.Name = ele.InnerText;
//b.获取该节点属性的集合
XmlAttributeCollection col = skillNode.Attributes;
//skill.Id = Int32.Parse(col[0].Value);
//通过字符串索引器,获取每一个属性对象
XmlAttribute idAttribute = col["SkillID"];
skill.Id = Int32.Parse(idAttribute.Value);
skill.EngName = col["SkillEngName"].Value;
skill.TriggerType = Int32.Parse(col["TriggerType"].Value);
skill.ImageFile = col["ImageFile"].Value;
skill.AvailableRace = Int32.Parse(col["AvailableRace"].Value);
skillList.Add(skill);
}
foreach (Skill s in skillList)
{
Console.WriteLine(s);
}
Console.ReadKey();
}
}
}
JSON
JSON的定义
- JSON是存储和交换文本信息的语法,类似于XML
- JSON比XML更小、更快、更容易解析,JSON跟XML一样是一种数据格式
- JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,它基于ECMAScipt的一个子集,JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯,包括C、C++、C#、JavaScript、Python等 (在其他语言中都可以做JSON语言的解析)
- 这些特性使JSON称为理想的数据交换语言,易于人阅读和编写,同时也易于机器解析和生成(网络传输速率)
特性:
- JSON是轻量级的文本数据交换格式
- JSON独立于语言
- JSON具有自我描述性,更易理解
JSON使用JavaScipt语法来描述数据对象,但是JSON仍然独立于语言和平台,JSON解析器和JSON库支持许多不同的编程语言
JSON语法规则
- 注意
- 数据在键值对中(中间加 “:”)
- 数据由逗号分隔
- 花括号保存对象
- 方括号保存数组
- JSON名称/值对
- JSON数据的书写格式:名称/值对
名称/值对组合中的名称写在前面(在“”中),值对写在后面(同样要加“”),中间用“:”隔开,比如“firstName”:“John”
- JSON值可以是:
- 数字(整数或浮点数)
- 字符串(在“”中)
- 逻辑值(true或false)
- 数组(在方括号中)
- 对象(在花括号中)
- null
- 例子
{
“employees”:
[
{"firstName":"Bill","lastName":"Gates"},
{"firstName":"George","lastName":"Bush"},
{"firstName":"Thomas","lastName":"Carter"}
]
}
JSON数据结构
JSON简单说就是JavaScript中的对象和数组,所以这两种结构就是对象和数组两种结构,通过这两种结构可以表示各种复杂的结构:
- 对象:对象在js中表示为“{}”括起来的内容,数据结构为 {key:value,key:value,…}的键值对 的结构,在面向对象的语言中,key为对象的属性,value为对应的属性值,所以会让很容易理解,取值方法为对象.key (C#中为 对象[key])获取属性值,这个属性值的类型可以是数字、字符串、数组、对象几种
- 数组:数组在js中是中括号"[]"括起来的内容,数据结构为[“java”,“javascript”,“vb”, …],取值方式和所有语言中一样,使用索引获取,字段值的类型可以是数字、字符串、数组、对象几种
经过对象、数组2种结构就可以组合成负责的数据结构了
实践1-使用jsonMapper解析json数据
- 添加Litjson的库
1.第一种方法: 上官网下载Litjson.dll文件,然后拷贝至项目工程文件中,之后在引用中添加Litjson.dll才可以使用的新的库
2.第二种方法: 右键“引用”,打开“netget程序包”,在联机里面搜索Litjson,在搜索结果中选择一个点击安装
- json文本
[
{
"Id": 1,
"Name": "天下无双",
"Damage": 123
},
{
"Id": 2,
"Name": "天下无贼",
"Damage": 222
},
{
"Id": 3,
"Name": "咫尺天涯",
"Damage": 492
}
]
//记得对象的键值之间用的是冒号!
- Skill技能类:
namespace _052_json操作
{
class Skill
{
public int Id { get; set; }
public string Name { get; set; }
public int Damage { get; set; }
public override string ToString()
{
return string.Format("id:{0},name:{1},damage:{2}",Id,Name,Damage);
}
}
}
- Program类:
using LitJson; //添加命名空间
using System.IO;
namespace _052_json操作
{
class Program
{
static void Main(string[] args)
{
//创建skill对象的集合
List<Skill> skillList = new List<Skill>();
//使用Litjson进行json文本的解析
//这里使用jsonMapper解析json文本,jsondata代表一个数组或者对象(这里表示的是数组)
JsonData jsonData = JsonMapper.ToObject(File.ReadAllText("json技能信息.txt"));
foreach (JsonData temp in jsonData) //这里temp表示一个对象
{
Skill skill = new Skill();
//可以通过字符串索引器获取键值对的值
JsonData idValue = temp["Id"];
JsonData nameValue = temp["Name"];
JsonData damageValue = temp["Damage"];
//获取的键值对的值都为jsonData类型,需要转换为相应的int和string类型
int id = Int32.Parse(idValue.ToString());
string name = damageValue.ToString();
int damage = Int32.Parse(damageValue.ToString());
skill.Id = id;
skill.Name = nameValue.ToString();
skill.Damage = damage;
skillList.Add(skill);
}
foreach (Skill skill in skillList)
{
Console.WriteLine(skill);
}
Console.ReadKey();
}
}
}
实践2-使用jsonMapper跟泛型解析json数据
using LitJson; //添加命名空间
using System.IO;
namespace _052_json操作
{
class Program
{
static void Main(string[] args)
{
//使用泛型去解析json,<>内指定一个类型直接帮我们解析出来
//json里面对象的键必须跟定义的类里面的字符/属性保持一致(大小写也不行),相当于构建了一个模型
//1.Skill类型的数组
Skill[] skillArray = JsonMapper.ToObject<Skill[]>(File.ReadAllText("json技能信息.txt"));
foreach (var temp in skillArray)
{
Console.WriteLine(temp);
}
//2.集合
List<Skill> skillList = JsonMapper.ToObject<List<Skill>>(File.ReadAllText("json技能信息.txt"));
foreach (var temp in skillList)
{
Console.WriteLine(temp);
}
Console.ReadKey();
}
}
}
另外一种比较复杂的json文件
/// <summary>
/// 主角信息json文件
/// </summary>
{
"Name": "Hero",
"Level": 99,
"Age": 18,
"SkillList": [
{
"Id": 1,
"Name": "天下无双",
"Damage": 123
},
{
"Id": 2,
"Name": "天下无贼",
"Damage": 222
},
{
"Id": 3,
"Name": "咫尺天涯",
"Damage": 492
}
]
}
/// <summary>
/// Player类
/// </summary>
class Player
{
public string Name { get; set; } //字段和属性名要和json里面的对应
public int Level { get; set; }
public int Age { get; set; }
public List<Skill> SkillList { get; set; }
public override string ToString()
{
return string.Format("Name:{0},Level:{1},Age:{2},SkillList:{3}", Name, Level, Age, SkillList);
}
}
/// <summary>
/// Program类
/// </summary>
class Program
{
static void Main(string[] args)
{
//得到是一个player类
Player p = JsonMapper.ToObject<Player>(File.ReadAllText("主角信息.txt"));
Console.WriteLine(p);
foreach (var temp in p.SkillList)
{
Console.WriteLine(temp);
}
}
}
把对象转换为json对象
class Program
{
static void Main(string[] args)
{
Player pp = new Player();
pp.Name = "kirito";
pp.Level = 100;
pp.Age = 16;
string json = JsonMapper.ToJson(pp);
Console.WriteLine(json);
}
}
{"Name":"kirito","Level":100,"Age":16,"SkillList":null}
Excel操作
1.使用OLEDB操作Excel
2.连接字符串
-
旧版本(以.xls为后缀)
string connectionString = “Provider=Microsoft.Jet.OLEDB.4.0;” + “Data Source=” + fileName + “;” + ";Extended Properties= “Excel 8.0;HDR = YES;IMEX=1” "; -
先版本(以.xlsx为后缀)
string connectionString=“Provider=Microsoft.Jet.OLEDB.12.0;”+“Data Source=”+fileName+";"+";Extended Properties= “Excel 12.0;HDR = YES;IMEX=1” " ;
实践:
注:如果报错System.Data.OleDb.OleDbException:“外部表不是预期的格式。”
这个错误,需要把Excel另存为xls格式
Excel表格:
一定要把Excel表格放在项目的输出目录里
using System.Data.OleDb; //添加命名空间
using System.Data;
namespace _053_Excel操作
{
class Program
{
static void Main(string[] args)
{
//使用数据源进行连接(数据源:数据库,Excel表格等)
// Provider组件版本,fileName数据源路径(相对/绝对)
string fileName = "装备信息.xls";
//string connectionString="Provider=Microsoft.Jet.OLEDB.12.0;"+"Data Source="+fileName+";"+";Extended Properties= \"Excel 12.0;HDR = YES;IMEX=1\" " ;
string connectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" + "Data Source=" + fileName + ";" + ";Extended Properties= \"Excel 8.0;HDR = YES;IMEX=1\" ";
//1.创建连接到数据源的对象
OleDbConnection connection = new OleDbConnection(connectionString);
//2.打开连接
connection.Open();
//3.查询
//如果有多个表格的数据的话,可以循环这一步操作
string sql = "select *from [Sheet1$]"; //查询命令,数据库语法
OleDbDataAdapter adapter = new OleDbDataAdapter(sql,connection); //查询结果
//4.把数据存放进dataset中
DataSet dataset = new DataSet(); //用来存放数据(DataTable)
adapter.Fill(dataset); //表示把查询的结果(datatable)填充到dataset里面
//5.关闭连接对象,释放连接资源
connection.Close();
//6.取得数据
DataTableCollection tableCollection = dataset.Tables;//获取当前集合中所有的表格
DataTable table = tableCollection[0]; //返回第一张表
//取得表格中的数据
DataRowCollection rowCollection = table.Rows;//取得table中所有的行(返回行的集合)
foreach (DataRow row in rowCollection)
{
//取得row中前8列的数据索引0-7
for (int i = 0; i < 8; i++)
{
Console.Write(row[i] + " ");
}
Console.WriteLine();
}
Console.ReadKey();
}
}
}