C#文本解析

本文为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();

 

上一篇:Skill 遍历整个项目设计的两个思路


下一篇:Linux seq命令详解