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 |