본문 바로가기

C#/XML

[C#] XmlHelper / XML 총정리

 

 

1. XML 읽기/쓰기/수정/삭제/정렬/재배치

public class XmlHelper
{
    private static string dirName = Path.Combine(Directory.GetCurrentDirectory(), "XmlData");
    private static string fileName = "Device";
 
    static string chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
    static int uidsIndex = 0;
    private static string MakeUid()
    {
        string result = "";
 
        result = chars[uidsIndex] + DateTime.Now.ToString("yyyyMMddHHmmssms");
        uidsIndex++;
        if (uidsIndex >= chars.Length)
        {
            uidsIndex = 0;
        }
 
        return result;
    }
 
    public static void AddXmlElement(DeviceModel model)
    {
        if (Directory.Exists(dirName) == false)
        {
            Directory.CreateDirectory(dirName);
        }
 
        if (File.Exists(dirName + "/" + fileName + ".xml") == false)
        {
            // xml 생성
            XElement doc = new XElement("root", new XElement("device", new XAttribute("uid", MakeUid()),
           new XElement("id", model.Id)
           , new XElement("ip", model.Ip)
           , new XElement("mac", model.MacAddress)
           , new XElement("name", model.Name)
           , new XElement("type", (int)model.Type)
           ));
 
            doc.Save(dirName + "/" + fileName + ".xml");
        }
        else
        {
            XElement doc = XElement.Load(dirName + "/" + fileName + ".xml");
            // 노드 추가
            XElement contents = new XElement("device", new XAttribute("uid", MakeUid()),
           new XElement("id", model.Id)
           , new XElement("ip", model.Ip)
           , new XElement("mac", model.MacAddress)
           , new XElement("name", model.Name)
           , new XElement("type", (int)model.Type)
           );
 
            doc.Add(contents);
 
            doc.Save(dirName + "/" + fileName + ".xml");
        }
    }
 
    
    public static List<DeviceModel> ReadXml()
    {
        List<DeviceModel> list = new List<DeviceModel>();
        bool needSave = false;
 
        try
        {
            XElement doc = XElement.Load(dirName + "/" + fileName + ".xml");
            foreach (XElement element in doc.Elements())
            {
                DeviceModel data = new DeviceModel();
 
                var uidAttr = element.Attribute("uid");
                if (uidAttr == null)
                {
                    var newUid = MakeUid();
                    element.SetAttributeValue("uid", newUid);
                    data.Uid = newUid;
                    needSave = true;
                }
                else
                {
                    if (string.IsNullOrEmpty(uidAttr.Value))
                    {
                        var newUid = MakeUid();
                        element.SetAttributeValue("uid", newUid);
                        data.Uid = newUid;
                        needSave = true;
                    }
                    else
                    {
                        data.Uid = uidAttr.Value;
                    }
                }
                
                data.Id = element.Element("id").Value;
                data.Ip = element.Element("ip").Value;
                data.MacAddress = element.Element("mac") == null ? "" : element.Element("mac").Value;
                data.Name = element.Element("name").Value;
                data.Type = (Enum_DeviceType)(Convert.ToInt32(element.Element("type").Value));
                
                list.Add(data);
            }
 
            if (needSave)
            {
                doc.Save(dirName + "/" + fileName + ".xml");
            }
        }
        catch (Exception ex)
        {
            Debug.WriteLine(ex.Message);
            ErrorLog.WriteLine(ex.Message);
        }
 
        return list;
    }
 
    public static void EditXmlElement(DeviceModel model)
    {
        try
        {
            XElement doc = XElement.Load(dirName + "/" + fileName + ".xml");
            foreach (XElement element in doc.Elements())
            {
                if (element.Attribute("uid").Value == model.Uid)
                {
                    element.Element("id").Value = model.Id;
                    element.Element("ip").Value = model.Ip;
                    element.Element("mac").Value = model.MacAddress;
                    element.Element("name").Value = model.Name;
                    element.Element("type").Value = ((int)model.Type).ToString();
 
                    break;
                }
            }
 
            doc.Save(dirName + "/" + fileName + ".xml");
        }
        catch(Exception ex)
        {
            Debug.WriteLine(ex.Message);
            ErrorLog.WriteLine(ex.Message);
        }
    }
 
    public static void DeleteXmlElement(string uid)
    {
        try
        {
            XElement doc = XElement.Load(dirName + "/" + fileName + ".xml");
            foreach (XElement element in doc.Elements())
            {
                if (element.Attribute("uid").Value == uid)
                {
                    element.Remove();
                    break;
                }
            }
 
            doc.Save(dirName + "/" + fileName + ".xml");
        }
        catch (Exception ex)
        {
            Debug.WriteLine(ex.Message);
            ErrorLog.WriteLine(ex.Message);
        }
    }
 
    public static bool ReArrangeXmlElement(int selectIndex, int targetIndex)
    {
        try
        {
            XElement doc = XElement.Load(dirName + "/" + fileName + ".xml");
 
            if (selectIndex == targetIndex)
            {
                return false;
            }
 
            var list = new List<XElement>();
            foreach (XElement element in doc.Elements())
            {
                list.Add(element);
            }
 
            // 사이로 이동
            if (selectIndex < targetIndex)
            {
                list.Insert(targetIndex + 1, list[selectIndex]);
                list.RemoveAt(selectIndex);
            }
            else
            {
                list.Insert(targetIndex, list[selectIndex]);
                list.RemoveAt(selectIndex + 1);
            }
            
            // 서로 바꾸기
            //var selectedItem = list[selectIndex];
            //var targetItem = list[targetIndex];
            //list[selectIndex] = targetItem;
            //list[targetIndex] = selectedItem;
 
            doc = new XElement("root");
            foreach (XElement element in list)
            {
                doc.Add(element);
            }
 
            doc.Save(dirName + "/" + fileName + ".xml");
 
            return true;
        }
        catch (Exception ex)
        {
            Debug.WriteLine(ex.Message);
            ErrorLog.WriteLine(ex.Message);
            return false;
        }
    }
}

 

 

 

2. 사용법

private void LoadDeviceList()
 {
     // xml에서 리스트 불러오기
     var devices = XmlHelper.ReadXml();
     DeviceModels = new ObservableCollection<DeviceModel>(devices);
 }
 
 public void AddDevice(DeviceModel model)
 {
     // xml에 저장
     XmlHelper.AddXmlElement(model);
     LoadDeviceList();
 }
 
 public void EditDevice(DeviceModel model)
 {
     XmlHelper.EditXmlElement(model);
     LoadDeviceList();
 }
 
 public void DeleteDevice(DeviceModel model)
 {
     if(MessageBox.Show(model.Name + " - 삭제 하시겠습니까?", "Question", MessageBoxButton.YesNo, MessageBoxImage.Warning) == MessageBoxResult.Yes)
     {
         XmlHelper.DeleteXmlElement(model.Uid);
         LoadDeviceList();
     }
 }
 
public void ReArrangeDevice(int selectIndex, int targetIndex)
{
    if (XmlHelper.ReArrangeXmlElement(selectIndex, targetIndex))
    {
        LoadDeviceList();
    }
}

'C# > XML' 카테고리의 다른 글

[C#] XmlString to Object 파싱  (0) 2020.09.11
[C#] XML 생성/쓰기 및 노드 추가하기  (0) 2020.09.08
[C#] XML 읽기  (0) 2020.09.04