XmlConfigOperation.cs 11.0 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 XmlConfigOperation
    {
        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<AgvInfo> 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)
            {
                AgvInfo agv_Info = new AgvInfo();
                // 将节点转换为元素,便于得到节点的属性值
                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;
                agv_Info.JobContext.Name = agv_Info.Name;
                XmlNodeList xnlScope = xnl0.Item(1).ChildNodes;
                agv_Info.Scope = new bean.agv.Scope();
                agv_Info.Scope.Workshop = xnlScope.Item(0).InnerText;
                agv_Info.Scope.Tasks = new List<string>();
                XmlNodeList xnlTask = xnlScope.Item(1).ChildNodes;
                foreach (XmlNode item in xnlTask)
                {
                    agv_Info.Scope.Tasks.Add(item.InnerText);
                }
                agv_Info.Scope.Remark = xnlScope.Item(2).InnerText;

                agv_Info.Auto = bool.Parse(xnl0.Item(2).InnerText);
                agv_Info.UseFleet = bool.Parse(xnl0.Item(3).InnerText);
                agv_Info.FleetIP = xnl0.Item(4).InnerText;
                agv_Info.Authorization = xnl0.Item(5).InnerText;
                agv_Info.IsDebug = bool.Parse(xnl0.Item(6).InnerText);
                XmlNode xnIO = xe.SelectSingleNode("IO_GUIDs");
                XmlNodeList xnlios = xnIO.ChildNodes;
                foreach (XmlNode item in xnlios)
                {
                    IOInfo iOInfo = new IOInfo();
                    iOInfo.IOID = item.InnerText;
                    agv_Info.IOStatus.Add(iOInfo);
                }
                agv_Info.StartTimer();
                agv_Infos.Add(agv_Info);
            }
            xmlReader.Close();
            isLoadAgv = true;
            LogUtil.info($"加载Agv配置成功:{File_AgvInfo}");
        }
        public static void SetAgvIsUse(AgvInfo 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[@ip=\"{0}\"]", agv.IP);
            XmlElement selectXe = (XmlElement)xe.SelectSingleNode(strPath);  //selectSingleNode 根据XPath表达式,获得符合条件的第一个节点.
            //selectXe.SetAttribute("Type", dgvBookInfo.CurrentRow.Cells[0].Value.ToString());//也可以通过SetAttribute来增加一个属性
             selectXe.GetElementsByTagName("Auto").Item(0).InnerText = agv.Auto.ToString();
             xmlDoc.Save(File_AgvInfo);
        }
        public static void SetAgvIsDebug(AgvInfo 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[@ip=\"{0}\"]", agv.IP);
            XmlElement selectXe = (XmlElement)xe.SelectSingleNode(strPath);  //selectSingleNode 根据XPath表达式,获得符合条件的第一个节点.
                                                                             //selectXe.SetAttribute("Type", dgvBookInfo.CurrentRow.Cells[0].Value.ToString());//也可以通过SetAttribute来增加一个属性
            selectXe.GetElementsByTagName("IsDebug").Item(0).InnerText = agv.IsDebug.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.Trim();
                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.Workshop =xnl0.Item(5).InnerText;
                node.Init();
                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)
            {
                XmlNodeList xnls = xnode.ChildNodes;
                foreach (XmlNode item in xnls)
                {
                    AgvTask node = new AgvTask();
                    // 将节点转换为元素,便于得到节点的属性值
                    XmlElement xe = (XmlElement)xnode;
                    node.TypeId = xe.GetAttribute("id");
                    // 得到属性的属性值
                    XmlElement itemxe = (XmlElement)item;
                    node.Id = int.Parse(itemxe.GetAttribute("id"));
                    // 得到节点的所有子节点
                    XmlNodeList xnl0 = itemxe.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.Guid = xnl0.Item(2).InnerText;
                node.Fixed = bool.Parse(xnl0.Item(3).InnerText);
                XmlNode xnAgv = xnl0.Item(4);
                XmlNodeList xnAgvs = xnAgv.ChildNodes;
                foreach (XmlNode item in xnAgvs)
                {
                   node.Agvs.Add(item.InnerText);
                }
                chargePiles.AddPile(node);
            }
            xmlReader.Close();
            LogUtil.info($"加载充电桩配置成功:{File_ChargePileInfo}");
        }
    }
}