XmlConfigOpManager.cs 9.1 KB
using Common;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Xml;

namespace DeviceLibrary.manager
{
    public class XmlConfigOpManager
    {
        static string File_AgvInfo = AGVManager.CONFIG_PATH + AppConfigHelper.GetValue(SettingString.File_AgvInfo);
        static string File_NodeInfo = AGVManager.CONFIG_PATH + AppConfigHelper.GetValue(SettingString.File_NodeInfo);
        static string File_AgvTaskInfo = AGVManager.CONFIG_PATH + AppConfigHelper.GetValue(SettingString.File_AgvTaskInfo);
        static string File_ChargePileInfo = AGVManager.CONFIG_PATH + "chargeinfos.xml";
        static bool isLoadAgv = false;
        static bool isLoadNode = false;
        public static void LoadAgvInfos(List<Agv_Info> agv_Infos)
        {
            XmlDocument doc = new XmlDocument();
            XmlReaderSettings xmlReaderSettings = new XmlReaderSettings();
            xmlReaderSettings.IgnoreComments = true;//忽略文档里面的注释
            XmlReader xmlReader = XmlReader.Create(File_AgvInfo, xmlReaderSettings);
            doc.Load(xmlReader);
            XmlNode xn = doc.SelectSingleNode("agvs");

            XmlNodeList xnl = xn.ChildNodes;
            foreach (XmlNode node in xnl)
            {
                Agv_Info agv_Info = new Agv_Info();
                // 将节点转换为元素,便于得到节点的属性值
                XmlElement xe = (XmlElement)node;
                // 得到属性的属性值
                agv_Info.ID = xe.GetAttribute("id").ToString();
                agv_Info.IP = xe.GetAttribute("ip").ToString();
                // 得到节点的所有子节点
                XmlNodeList xnl0 = xe.ChildNodes;
                agv_Info.Name = xnl0.Item(0).InnerText;
                XmlNodeList xeAreas = xnl0.Item(1).ChildNodes;
                agv_Info.ResponsAreas = new List<Area>();
                foreach (XmlNode item in xeAreas)
                {
                    agv_Info.ResponsAreas.Add((Area)Enum.Parse(typeof(Area), item.InnerText));
                }
                agv_Info.IsUse = bool.Parse(xnl0.Item(2).InnerText);
                agv_Info.UseFleet = bool.Parse(xnl0.Item(3).InnerText);
                agv_Info.Authorization = xnl0.Item(4).InnerText;
                agv_Info.IOID = xnl0.Item(5).InnerText;
                agv_Infos.Add(agv_Info);
            }
            xmlReader.Close();
            isLoadAgv = true;
            LogUtil.info($"加载Agv配置成功{File_AgvInfo}");
        }

        public static void SetAgvIsUse(Agv_Info agv)
        {
            if (!isLoadAgv) return;
            XmlDocument xmlDoc = new XmlDocument();
            xmlDoc.Load(File_AgvInfo);
            XmlElement xe = xmlDoc.DocumentElement; // DocumentElement 获取xml文档对象的根XmlElement.
             string strPath = string.Format("/agvs/agv[@id=\"{0}\"]", agv.ID);
            XmlElement selectXe = (XmlElement)xe.SelectSingleNode(strPath);  //selectSingleNode 根据XPath表达式,获得符合条件的第一个节点.
            //selectXe.SetAttribute("Type", dgvBookInfo.CurrentRow.Cells[0].Value.ToString());//也可以通过SetAttribute来增加一个属性
             selectXe.GetElementsByTagName("IsUse").Item(0).InnerText = agv.IsUse.ToString();
             xmlDoc.Save(File_AgvInfo);
        }

        public static void LoadNodeInfos(List<Node> nodes)
        {
            XmlDocument doc = new XmlDocument();
            XmlReaderSettings xmlReaderSettings = new XmlReaderSettings();
            xmlReaderSettings.IgnoreComments = true;//忽略文档里面的注释
            XmlReader xmlReader = XmlReader.Create(File_NodeInfo, xmlReaderSettings);
            doc.Load(xmlReader);
            XmlNode xn = doc.SelectSingleNode("nodes");

            XmlNodeList xnl = xn.ChildNodes;
            foreach (XmlNode xnode in xnl)
            {
                //                nodeInfo.Add(new Node(id, name, ip, alicename, nodeType, area, isUse));
                Node node = new Node();
                // 将节点转换为元素,便于得到节点的属性值
                XmlElement xe = (XmlElement)xnode;
                // 得到属性的属性值
                node.Id = int.Parse(xe.GetAttribute("id"));
                // 得到节点的所有子节点
                XmlNodeList xnl0 = xe.ChildNodes;
                node.IP = xnl0.Item(0).InnerText;
                node.Name = xnl0.Item(1).InnerText;
                node.IsUse = bool.Parse(xnl0.Item(2).InnerText);
                node.AliceName = xnl0.Item(3).InnerText;
                node.Type = (NodeType)Enum.Parse(typeof(NodeType),xnl0.Item(4).InnerText);
                node.Area =(Area)Enum.Parse(typeof(Area),xnl0.Item(5).InnerText);
                nodes.Add(node);
            }
            xmlReader.Close();
            isLoadNode = true;
            LogUtil.info($"加载节点配置成功{File_NodeInfo}");
        }

        public static void SetNodeIsUse(Node node)
        {
            if (!isLoadNode) return;
            XmlDocument xmlDoc = new XmlDocument();

            xmlDoc.Load(File_NodeInfo);
            XmlElement xe = xmlDoc.DocumentElement; // DocumentElement 获取xml文档对象的根XmlElement.
            string strPath = string.Format("/nodes/node[@id=\"{0}\"]", node.Id);
            XmlElement selectXe = (XmlElement)xe.SelectSingleNode(strPath);  //selectSingleNode 根据XPath表达式,获得符合条件的第一个节点.
                                                                             //selectXe.SetAttribute("Type", dgvBookInfo.CurrentRow.Cells[0].Value.ToString());//也可以通过SetAttribute来增加一个属性
            selectXe.GetElementsByTagName("IsUse").Item(0).InnerText = node.IsUse.ToString();
            xmlDoc.Save(File_NodeInfo);
        }

        public static void LoadTaskInfos(List<AgvTask> tasks)
        {
            XmlDocument doc = new XmlDocument();
            XmlReaderSettings xmlReaderSettings = new XmlReaderSettings();
            xmlReaderSettings.IgnoreComments = true;//忽略文档里面的注释
            XmlReader xmlReader = XmlReader.Create(File_AgvTaskInfo, xmlReaderSettings);
            doc.Load(xmlReader);
            XmlNode xn = doc.SelectSingleNode("tasks");

            XmlNodeList xnl = xn.ChildNodes;
            foreach (XmlNode xnode in xnl)
            {
                //                nodeInfo.Add(new Node(id, name, ip, alicename, nodeType, area, isUse));
                AgvTask node = new AgvTask();
                // 将节点转换为元素,便于得到节点的属性值
                XmlElement xe = (XmlElement)xnode;
                // 得到属性的属性值
                node.Id = int.Parse(xe.GetAttribute("id"));
                // 得到节点的所有子节点
                XmlNodeList xnl0 = xe.ChildNodes;
                node.Name = xnl0.Item(0).InnerText;
                node.AliceName = xnl0.Item(1).InnerText;
                node.Guid = xnl0.Item(2).InnerText;
                node.Type = (TaskType)Enum.Parse(typeof(TaskType), xnl0.Item(3).InnerText);
                tasks.Add(node);
            }
            xmlReader.Close();
            LogUtil.info($"加载任务配置成功{File_AgvTaskInfo}");
        }

        public static void LoadChargePileInfos(bean.ChargePiles chargePiles)
        {
            XmlDocument doc = new XmlDocument();
            XmlReaderSettings xmlReaderSettings = new XmlReaderSettings();
            xmlReaderSettings.IgnoreComments = true;//忽略文档里面的注释
            XmlReader xmlReader = XmlReader.Create(File_ChargePileInfo, xmlReaderSettings);
            doc.Load(xmlReader);
            XmlNode xnMin = doc.SelectSingleNode("root/min");
            chargePiles.BatteryMin = int.Parse(xnMin.InnerText);
            XmlNode xnMid = doc.SelectSingleNode("root/mid");
            chargePiles.BatteryMiddle = int.Parse(xnMid.InnerText);
            XmlNode xnMax = doc.SelectSingleNode("root/max");
            chargePiles.BatteryMax = int.Parse(xnMax.InnerText);
            XmlNode xn = doc.SelectSingleNode("root/piles");
            XmlNodeList xnl = xn.ChildNodes;
            foreach (XmlNode xnode in xnl)
            {
                bean.ChargePile node = new bean.ChargePile();
                // 将节点转换为元素,便于得到节点的属性值
                XmlElement xe = (XmlElement)xnode;
                // 得到属性的属性值
                node.Id = int.Parse(xe.GetAttribute("id"));
                // 得到节点的所有子节点
                XmlNodeList xnl0 = xe.ChildNodes;
                node.Name = xnl0.Item(0).InnerText;
                node.AliceName = xnl0.Item(1).InnerText;
                node.Fixed = bool.Parse(xnl0.Item(2).InnerText);
                XmlNode xnAgv = xnl0.Item(3);
                XmlNodeList xnAgvs = xnAgv.ChildNodes;
                foreach (XmlNode item in xnAgvs)
                {
                   node.Agvs.Add(item.InnerText);
                }
                chargePiles.AddPile(node);
            }
            xmlReader.Close();
            LogUtil.info($"加载充电桩配置成功{File_ChargePileInfo}");
        }
    }
}