• C#之XML读取


    一、XML读取一,只有一个父节点的情况下,只需要获取该父节点下所有的子节点,然后对每个节点进行相关的处理,根据Object--Model--Connection(对象模型关系映射处理)就能得到想要的数据,或者是数据对象。

    <Item>
        <Item id="101" name="Admin01" age="23"/>
        <Item id="102" name="Admin02" age="24"/>
        <Item id="103" name="Admin03" age="25"/>
        <Item id="104" name="Admin04" age="26"/>
    </Item>

      面对上述情况的XML文件时,读取代码如下:

    /// <summary>
    /// 获取XMl父节点下所有的子节点(当所有的子节点全部在总父节点下时)
     /// </summary>
    /// <param name="path">xml文件所在的路径</param>
    /// <returns></returns>
    public XmlNodeList GetXmlNodes(string path)
    {
       XmlDocument doc = new XmlDocument();
      doc.Load(path);
      XmlNode node =  doc.FirstChild;
      XmlNodeList xmlList =  node.ChildNodes;
      return xmlList;
    }

      当获取到所有的子节点后,将节点对应到模型类,然后将节点数据转换成对象,这是一个泛型的方法,可以通用,传入对应的节点,以及要获取的对象类型,就能获取到对应的对象列表,代码如下:

    /// <summary>
    /// 模型映射到对象
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <param name="nodeList"></param>
    /// <returns></returns>
    public List<T> GetDataByModel<T>(List<XmlNode> nodeList)
    {
        List<T> list = new List<T>();
        Type t = typeof(T);
        MethodInfo func = t.GetMethod("Parse");//这里使用了C#反射的技术
        int i = 0;
        while (i<nodeList.Count)
        {
            T tmpVo = (T)func.Invoke(null, new object[] { nodeList[i] });
            list.Add(tmpVo);
            i++;
        }
        return list;
    }

    模型类如下:

    ///模型类和XML文件中一个节点的数据进行对应
    public class RoleVo
        {
            private int id;
            private string name;
            private int age;
    
            public int ID
            {
                get { return id; }
                set { id = value; }
            }
    
            public string Name
            {
                get { return name; }
                set { name = value; }
            }
    
            public int Age
            {
                get { return age; }
                set
                {
                    age = value;
                }
            }
            public static RoleVo Parse(XmlNode node)
            {
                RoleVo vo = new RoleVo();
                vo.ID = int.Parse(node.Attributes["id"].Value.ToString());
                vo.Age = int.Parse(node.Attributes["age"].Value.ToString());
                vo.Name = node.Attributes["name"].Value.ToString();
                return vo;
            }
        }

    二、当节点相互嵌套时,例如下面的XML文件内容,这是需要利用到一个递归的思想,循环获取才能得到所有的XML节点,XMl代码和C#代码如下:

    <Item>
        <Item>
            <Item id="101" hp="100" att="20" name="史莱姆"/>
        </Item>
        <Item>
            <Item id="102" hp="120" att="25" name="哥布林"/>
        </Item>
        <Item>
            <Item id="103" hp="140" att="50" name="泰勒"/>
        </Item>
        <Item>
            <Item id="104" hp="160" att="75" name="扎西"/>
        </Item>
    </Item>

    递归获取所有节点:

    /// <summary>
    /// 获取父节点下所有的子节点(当总父节点下其他节点也存在另外的父节点时)
    /// </summary>
    /// <param name="path">xml文件所在的路径</param>
    /// <returns></returns>
    public List<XmlNode> GetXmlNodeList(string path)
    {
        XmlDocument doc = new XmlDocument();
        doc.Load(path);
        XmlNode parentNode = doc.FirstChild;
        List<XmlNode> ListNode = new List<XmlNode>();
        if (parentNode.HasChildNodes)
        {
            int i = 0;
            while (i<parentNode.ChildNodes.Count)
            {
                GetXmlNodeInChild(parentNode.ChildNodes[i],ref ListNode);
                i++;
            }
        }
        return ListNode;
    }
    
    /// <summary>
    /// 递归获取所有的子节点
    /// </summary>
    /// <param name="childNode"></param>
    /// <param name="list"></param>
    public void GetXmlNodeInChild(XmlNode childNode,ref List<XmlNode> list)
    {
        if (childNode.HasChildNodes)
        {
            int i = 0;
            while (i<childNode.ChildNodes.Count)
            {
                GetXmlNodeInChild(childNode.ChildNodes[i], ref list);
                i++;
            }
        }
        else
        {
            list.Add(childNode);
        }
    }

    模型类如下:

    public class EnemyVo
        {
            private int id;
            private int hp;
            private int att;
            private string name;
    
            public int ID { get { return id; } set { id = value; } }
            public int HP { get { return hp; } set { hp = value; } }
            public int Att { get { return att; } set { att = value; } }
            public string Name { get { return name; } set { name = value; } }
    
            public static EnemyVo Parse(XmlNode node)
            {
                EnemyVo vo = new EnemyVo();
                vo.ID = int.Parse(node.Attributes["id"].Value.ToString());
                vo.HP = int.Parse(node.Attributes["hp"].Value.ToString());
                vo.Att = int.Parse(node.Attributes["att"].Value.ToString());
                vo.name = node.Attributes["name"].Value.ToString();
                return vo;
            }
        }
  • 相关阅读:
    简介.Net对象序列化.txt
    如何在Web页面退出前提示用户保存数据?
    如何将图片存储到数据库中
    页面回车键响应,onkeydown事件
    用C#创建Windows服务(Windows Services)
    解决“Visual Studio 要求设计器使用文件中的第一个类。移动类代码使之成为文件中的第一个类,然后尝试重新加载设计器。”方法
    动态创建htm元素并添加到document中
    如何在Asp.net的Header中添加/title/Meta tages/CSS
    无法打开项目文件,“d:\web\webapp.csproj”,此安装不支持该项目类型
    用Intelligencia.UrlRewriter实现URL重写
  • 原文地址:https://www.cnblogs.com/yuanshuang-club/p/12022037.html
Copyright © 2020-2023  润新知