본문 바로가기
Programming/C# & .NET

[C#] XmlElement 여러개 설정

by Kor-IT 2023. 1. 11.
반응형

 

XmlElement 여러개 설정 방법

 

해당 글은 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라고 부르고 있다.

 

 

특성을 사용하여 XML Serialization 제어

특성을 사용하여 개체의 XML serialization을 제어하거나 동일한 클래스 집합에서 대체 XML 스트림을 만들 수 있습니다.

learn.microsoft.com

 

 

 

반응형

댓글