해당 글은 XmlElement 여러 개 설정하는 상황과 방법에 대해 알 수 있다. 최근 비슷한 Xml 형식에 List 받는 부분만 달라지는 경우가 발생하여 해당 상황을 어떻게 하면 좀 더 편리하게 관리할 수 있을지 고민하다가 활용한 방법이다.
XmlElement는 Xml의 요소를 나타낸다. XmlElement의 속성들 중 ElementName, Type을 이용하여 다양한 객체를 하나의 속성으로 받아 사용하기 위해 해당 설정을 하여 해결이 가능했다. 해당 방법은 아래 사용방법과 예시를 통해 좀 더 자세히 설명하겠다.
사용방법
Data1
<menu>
<count>2</count>
<menuList>
<pizza>
<name>potato</name>
<price>23400</price>
<dough>thin</dough>
<size>Large</size>
</pizza>
<pizza>
<name>pepperoni</name>
<price>11400</price>
<dough>thin</dough>
<size>small</size>
</pizza>
</menuList>
</menu>
Data2
<menu>
<count>2</count>
<menuList>
<pasta>
<name>pasta1</name>
<price>11000</price>
<spicyLevel>2</spicyLevel>
</pasta>
<pasta>
<name>pasta2</name>
<price>23400</price>
<spicyLevel>1</spicyLevel>
</pasta>
</menuList>
</menu>
Data1 은 pizza 관련된 XML 이고 Data2는 pasta와 관련된 데이터이다. 2개의 XML 비교해 보면 동일한 'menuList' Root에 있으며 List 형태만 다르다. 결국 menuList 안에 들어가는 객체만 다르다는 판단이 된다.
<menu> Element 안에 <count> 와 <menuList> 있으며 <menuList> 안에 <pizza>와 <pasta> Element 가 들어가 있다.
해당 Data1, Data2를 바탕으로 클래스를 구성하며 XmlElement 속성 설정을 해보겠다.
Class
Menu Class
[XmlRoot(elementName: "menu")]
public class Menu
{
[XmlElement(elementName: "count")]
//public int Count { get => this.MenuList.list.Count; }
public int Count { get; set; }
[XmlElement(elementName: "menuList")]
public MenuList MenuList { get; set; }
}
MenuList Class
[XmlRoot(ElementName = "menuList")]
public class MenuList
{
//[XmlElement(Type = typeof(Pizza), ElementName = "pizza"),
// XmlElement(Type = typeof(Pasta), ElementName = "pasta")]
[XmlElement(Type = typeof(Pizza), ElementName = "pizza")]
[XmlElement(Type = typeof(Pasta), ElementName = "pasta")]
public ArrayList list { get; set; }
}
- Xmlelement 설정 시 대괄호 안에 다 구성해도 되며 따로따로 구성해도 된다.
Pizza Class
[XmlRoot(ElementName = "pizza")]
public class Pizza
{
[XmlElement("name")]
public string Name { get; set; }
[XmlElement("price")]
public double Price { get; set; }
[XmlElement("dough")]
public string Dough { get; set; }
[XmlElement("size")]
public string Size { get; set; }
}
Pasta Class
[XmlRoot(ElementName = "pasta")]
public class Pasta
{
[XmlElement("name")]
public string Name { get; set; }
[XmlElement("price")]
public double Price { get; set; }
[XmlElement("spicyLevel")]
public int SpicyLevel { get; set; }
}
총 4개의 Class를 구성했다. 최상위 부터 Menu, MenuList Class 를 만들며 MenuList에 들어가는 각각의 Pizza, Pasta Class를 구성했다.
여기서 중요한 부분은 MenuList Class이다. 중복되는 부분을 XmlElement 설정을 Type과 ElementName을 같이 설정하여 다양한 객체를 받도록 선언한다.
xmlData 변수에 Data1, Data2를 번갈아 설정 후 아래 코드를 실행하면 각각의 클래스가 자동으로 매칭되는 걸 확인할 수 있다.
XmlSerializer xs = new XmlSerializer(typeof(Menu));
string xmlData = @"{XML Data를 넣어주세요}"
Menu menu = new Menu();
using (StringReader sr = new StringReader(xmlData))
{
menu = (Menu)xs.Deserialize(sr);
}
foreach(var item in menu.MenuList.list)
{
Console.WriteLine(item.GetType().Name);
}
[출력]
Pizza
Pizza
[출력]
Pasta
Pasta
공통된 부분을 만들어두고 변경되는 부분만 따로 Class로 관리하게 될 수 있다. 해당 방식을 MS에서는 ArrayList Serialize라고 부르고 있다.
'Programming > C# & .NET' 카테고리의 다른 글
[C#] Linq - Aggregate 메서드 (0) | 2023.06.27 |
---|---|
[C#] LINQ 란? - 소개 (Language-Integrated Query) (1) | 2023.02.18 |
[C#] XMl 직렬화, 역직렬화 Method 공유 (2) | 2023.01.06 |
[C#] XML 직렬화, 역직렬화 (Serialize, Deserialize) (0) | 2023.01.06 |
[C#] switch 식 (1) | 2022.12.02 |
댓글