【C#学习12】XML、JSON、Excel操作

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元素指的是从(且包括)开始标签直到(且包括)结束标签的部分

  1. 所有XML元素都必须有关闭标签(结尾必须有 '/ ')
<p>This is a paragraph </p>
  1. XML标签对大小写敏感,比如两个标签< Letter > 与< letter >
<Message>这是错误的。</message>
<message>这是正确的。</message>
  1. XML必须正确地嵌套
<b><i>这是错误的。</b></i>
<b><i>这是正确的。</i></b>
  1. XML文档必须有根元素(根结点)
<root>
 <child>
  <subchild>...</subchild>
 </child>
</root>
  1. 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元素必须遵循以下命名规则:

  1. 名称可以含字母、数字以及其他的字符
  2. 名称不能数字或者标点符号开始
  3. 名称不能以字符 “XML”(或者XML、Xml关键字)开始
  4. 名称不能包含空格
  5. 可使用任何名称,没有保留的字词

案例1-xml文档解析

  1. 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的定义

  • 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语法规则

  1. 注意
  • 数据在键值对中(中间加 “:”)
  • 数据由逗号分隔
  • 花括号保存对象
  • 方括号保存数组
  • JSON名称/值对
  • JSON数据的书写格式:名称/值对

名称/值对组合中的名称写在前面(在“”中),值对写在后面(同样要加“”),中间用“:”隔开,比如“firstName”:“John”

  1. JSON值可以是:
  • 数字(整数或浮点数)
  • 字符串(在“”中)
  • 逻辑值(true或false)
  • 数组(在方括号中)
  • 对象(在花括号中)
  • null
  1. 例子
{
“employees”:
	[
		{"firstName":"Bill","lastName":"Gates"},
		{"firstName":"George","lastName":"Bush"},
		{"firstName":"Thomas","lastName":"Carter"}
	]
}

JSON数据结构

JSON简单说就是JavaScript中的对象和数组,所以这两种结构就是对象和数组两种结构,通过这两种结构可以表示各种复杂的结构:

  1. 对象:对象在js中表示为“{}”括起来的内容,数据结构为 {key:value,key:value,…}的键值对 的结构,在面向对象的语言中,key为对象的属性,value为对应的属性值,所以会让很容易理解,取值方法为对象.key (C#中为 对象[key])获取属性值,这个属性值的类型可以是数字、字符串、数组、对象几种
  2. 数组:数组在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(); 
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值