-
Notifications
You must be signed in to change notification settings - Fork 0
/
XmlHandler.cs
157 lines (129 loc) · 5.34 KB
/
XmlHandler.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
using System;
using System.Xml;
using System.Collections.Generic;
class XmlHandler
{
private XmlDocument xml;
private string xmlFilePath;
/// <summary>
/// Xml파일을 Load하고, 모듈을 초기화한다.
/// </summary>
/// <param name="xmlFilePath">사용할 Xml파일의 전체 경로</param>
/// <usage>
/// XmlHandler xmlHandler = new XmlHandler(xmlFilePath);
/// </usage>
public XmlHandler(string xmlFilePath)
{
this.xmlFilePath = xmlFilePath;
xml = new XmlDocument
{
PreserveWhitespace = false
};
xml.Load(xmlFilePath);
}
/// <summary>
/// Node 경로에 해당하는 Xml Data를 읽어, string형식으로 반환한다.
/// </summary>
/// <param name="firstDepthNodeName">Root노드 하위의 FirstNode</param>
/// <param name="secondDepthNodeName">FirstNode노드 하위의 SecondNode</param>
/// <param name="targetNodeName">SecondNode 하위의 targetNode</param>
/// <usage>
/// string targetData = xmlHandler.ReadXmlNode("FirstDepth", "SecondDepth", "targetNode");
/// </usage>
public string ReadXmlNode(string firstDepthNodeName, string secondDepthNodeName, string targetNodeName)
{
XmlNodeList xmlNodeList = xml.SelectNodes($"/Root/{firstDepthNodeName}");
string targetValue = null;
foreach (XmlNode xmlNode in xmlNodeList)
{
targetValue = xmlNode[$"{secondDepthNodeName}"][$"{targetNodeName}"].InnerText;
}
return targetValue;
}
public List<string> ReadXmlNodeList(string firstDepthNodeName, string secondDepthNodeName)
{
List<string> dataList = new List<string>();
XmlNodeList xmlNodeList = xml.SelectNodes($"/Root/{firstDepthNodeName}/{secondDepthNodeName}");
foreach (XmlNode xmlNode in xmlNodeList)
{
foreach (XmlElement xe in xmlNode)
{
dataList.Add(xe.InnerText);
}
}
return dataList;
}
/// <summary>
/// Node 경로를 받아, 해당 Xml의 Data를 생성하거나 덮어씌운다.
/// </summary>
/// <param name="targetContent">Xml에 추가할 데이터</param>
/// <param name="firstDepthNodeName">Root노드 하위의 FirstNode</param>
/// <param name="secondDepthNodeName">FirstNode노드 하위의 SecondNode</param>
/// <param name="targetNodeName">SecondNode 하위의 targetNode</param>
/// <usage>
/// xmlHandler.WriteXmlNode("Data Value", "FirstDepth", "SecondDepth", "targetNode");
/// </usage>
public void WriteXmlNode(string targetContent, string firstDepthNodeName, string secondDepthNodeName, string targetNodeName)
{
XmlNode rootNode = xml.SelectSingleNode("Root");
XmlNode firstDepthNode = rootNode.SelectSingleNode(firstDepthNodeName);
if (firstDepthNode == null)
{
firstDepthNode = xml.CreateElement(firstDepthNodeName);
}
XmlNode secondDepthNode = firstDepthNode.SelectSingleNode(secondDepthNodeName);
if (secondDepthNode == null)
{
secondDepthNode = xml.CreateElement(secondDepthNodeName);
}
XmlNode targetNode = secondDepthNode.SelectSingleNode(targetNodeName);
if (targetNode == null)
{
targetNode = xml.CreateElement(targetNodeName);
}
targetNode.InnerText = targetContent;
secondDepthNode.AppendChild(targetNode);
firstDepthNode.AppendChild(secondDepthNode);
xml.Save(xmlFilePath);
}
/// <summary>
/// Node 경로에 해하는 Xml을 삭제한다.
/// </summary>
/// <param name="firstDepthNodeName">Root노드 하위의 FirstNode</param>
/// <param name="secondDepthNodeName">FirstNode노드 하위의 SecondNode, Null이면 FirstNode까지 삭제한다.</param>
/// <param name="valueNodeName">SecondNode 하위의 targetNode, Null이면 SecondNode까지 삭제한다.</param>
/// <usage>
/// xmlHandler.DeleteXmlNode("FirstDepth", "SecondDepth", "targetNode");
/// xmlHandler.DeleteXmlNode("FirstDepth", "SecondDepth");
/// xmlHandler.DeleteXmlNode("FirstDepth");
/// </usage>
public void DeleteXmlNode(string firstDepthNodeName, string secondDepthNodeName = null, string valueNodeName = null)
{
XmlNode rootNode = xml.SelectSingleNode("Root");
XmlNode firstDepthNode = rootNode.SelectSingleNode(firstDepthNodeName);
// 파라미터를 1번째 뎊스까지만 기재했다면 해당 노드와 자식을 모두 제거한다.
if (secondDepthNodeName == null)
{
rootNode.RemoveAll();
xml.Save(xmlFilePath);
return;
}
XmlNode secondDepthNode = firstDepthNode.SelectSingleNode(secondDepthNodeName);
// 파라미터를 2번째 뎊스까지만 기재했다면 해당 노드와 자식을 모두 제거한다.
if (valueNodeName == null)
{
firstDepthNode.RemoveChild(secondDepthNode);
xml.Save(xmlFilePath);
return;
}
else
{
// 모두 기재했을 경우
XmlNode valueNode = secondDepthNode.SelectSingleNode(valueNodeName);
Console.WriteLine(valueNode == null);
secondDepthNode.RemoveChild(valueNode);
xml.Save(xmlFilePath);
return;
}
}
}