本文为CSDN博主「午夜支枕听河流」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_24642743/article/details/72717003
文本解析有3种,分别为:XML解析,JSON解析和Excel解析
一 XML解析
XML解析,可以细分为两种,一种是子节点的字段值较多,另一种是子节点的属性较多。本文会通过具体示例来详细讲述以上两种的适用场景。
在第一种,子节点的字段值较多的。解析示例:如解析下述XML文件。
被解析的xml文件: <skills> <skill> <id>2</id> <name lang ="cn">天下无双</name> <damage>123</damage> </skill> <skill> <id>3</id> <name lang ="cn">永恒零度</name> <damage>90</damage> </skill> <skill> <id>4</id> <name lang="cn">咫尺天涯</name> <damage>400</damage> </skill> </skills>
解析思想:利用位于System.Xml下的xml解析类XmlDocument。首先获取根节点,然后根据根节点获取其所有的子节点集合。再获取每个子节点的字段值。比如:示例中的,首先获取skills结点,然后再获取它的子节点skill,最后根据子节点依次获取id、name、damage等字段值。
具体解析逻辑代码如下:
class Program { static void Main(string[] args) { //创建技能信息集合,用来存储技能 List<Skill> skillList = new List<Skill>(); //XmlDocument专门用来解析xml文档 XmlDocument xmlDoc = new XmlDocument(); //选择要加载解析的xml文档的名字 //xmlDoc.Load("skillInfo.xml");//第一种加载方式 //第二种加载方式 传递一个字符串(xml格式的字符串) xmlDoc.LoadXml(File.ReadAllText("skillInfo.xml")); //得到根结点 XmlNode rootNode = xmlDoc.FirstChild;//获取第一个结点 //得到根结点下面的子结点的集合 XmlNodeList skillNodeList =rootNode.ChildNodes;//获取当前节点下面的所有子节点 foreach (XmlNode skillNode in skillNodeList) { Skill skill = new Skill();//利用每个Skill结点创建一个对象 XmlNodeList fieldNodeList = skillNode.ChildNodes;//获取skill结点下面所有的结点 foreach (XmlNode fieldNode in fieldNodeList) { //通过Name属性 可以获取一个结点的名字 if (fieldNode.Name == "id") { int id = Int32.Parse(fieldNode.InnerText);//获取结点内部的文本 skill.Id = id; } else if (fieldNode.Name == "name") { string name = fieldNode.InnerText; skill.Name = name; skill.Lang = fieldNode.Attributes[0].Value;//获取属性值 } else if (fieldNode.Name == "damage") { skill.Damage = Int32.Parse(fieldNode.InnerText); } } skillList.Add(skill); } foreach (var skill in skillList) { //此处,需要自己重写Skill类的ToString方法 Console.WriteLine(skill.ToString()); } Console.ReadKey(); } }
再看看第二种,子节点属性值较多时如何解析。解析示例如下:
<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> <Skill SkillID="20005" SkillEngName="Revenge" TriggerType="5" ImageFile="data/gfx/image/gui_icon_skill_003.dds" AvailableRace="2" > <Name>光之复仇</Name> </Skill> </SkillList> </SkillInfo>
解析思想:首先还是获取根节点,然后根据根节点获取属性上层的父节点集合,然后通过遍历,利用XmlNode类的Attributes属性获取每层遍历的属性集合。再通过XmlAttributeCollection 类的字符串索引器,依次获取每个属性值。
具体解析逻辑代码如下:
class Program { static void Main(string[] args) { List<Skill> skillList = new List<Skill>(); XmlDocument xmlDoc = new XmlDocument(); xmlDoc.Load("xml技能信息.txt"); //获取根结点 XmlNode skillInfoNode = xmlDoc.FirstChild; XmlNode skillListNode = skillInfoNode.FirstChild; //获取属性父节点集合 XmlNodeList skilNodeList = skillListNode.ChildNodes; //通过遍历获取每个属性的父节点 foreach (XmlNode skillNode in skilNodeList) { Skill skill = new Skill(); //用索引器获取同级字段值 XmlElement ele = skillNode["Name"]; skill.Name = ele.InnerText; //获取该结点字段属性集合 XmlAttributeCollection col = skillNode.Attributes; //通过字符串索引器获取一个属性对象 skill.Id = Int32.Parse(col["SkillID"].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 (var skill in skillList) { //同上 Console.WriteLine(skill); } Console.ReadKey();