C# 一次性读写XML子节点所有的数据【通过递归遍历】

public class MyXML
    {
        public string MyPath;
        //XML文件路径
        private XmlDocument XmlDoc;
        private XmlNodeList MyList;
        //创建xml实体
        public ArrayList MyArr_Get = new ArrayList();
        //数组【存放当前xml的值】
        public ArrayList MyArr_Set = new ArrayList();
        //数组【存放要更替xml的值】
        
        /*---------------初始化--------------------*/
        public void Init()
        {
            MyArr_Get.Clear();
            //数组1_初始化
            MyArr_Set.Clear();
            //数组2_初始化
            //MyArr_Temp.Clear();
            XmlDoc = new XmlDocument();
            //初始化一个xml实例
            XmlDoc.Load(MyPath);
            //载入文件
            XmlElement root = XmlDoc.DocumentElement;
            MyList = root.ChildNodes;
            //指向最顶层的节点
        }

        public void GetDatas()
        {
            FunGetDatasFromXML(MyList);
            //return MyArr_Get;
        }

        public void SetDatas()
        {
            FunSetDatasFromXML(MyList);
            XmlDoc.Save(MyPath);
        }

        /*--------------递归函数【逐层获取各子节点数据】----------------*/
        private void FunGetDatasFromXML(XmlNodeList myXmlNodeList)
        {
            foreach (XmlNode node in myXmlNodeList)
            {
                if (node.NodeType == XmlNodeType.Element)
                    FunGetDatasFromXML(node.ChildNodes);
                else
                    MyArr_Get.Add(node.Value);
            }
        }

        /*--------------递归函数【逐层替换各子节点数据】----------------*/
        private void FunSetDatasFromXML(XmlNodeList myXmlNodeList)
        {
            foreach (XmlNode node in myXmlNodeList)
            {
                if (node.NodeType == XmlNodeType.Element)
                {
                    FunSetDatasFromXML(node.ChildNodes);
                }
                else
                {
                    node.InnerText = MyArr_Set[0].ToString();
                    MyArr_Set.RemoveAt(0);
                }
            }
        }
    }

想法:

【读值】遍历整个节点,每次获取节点,判断节点的值【node.Value】是否是null,如果是null,说明其下层还存在<>xx</>,并在该节点进行下级遍历;否则此节点就是纯数据并无下层,然后切换到同层下一个节点进行判断;

【写值】遍历整个节点,每次获取节点,判断节点的值【node.NodeType】是否是Element类型,如果是,说明其下层还存在<>xx</>,并在该节点进行下级遍历;否则此节点就是纯数据并无下层,然后切换到同层下一个节点进行判断

【核心】把当前的【node.NodeType】作为判断下级存在<>xx</>的依据

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值