1.  XmlDocument 클래스를 이용해 XML 작성하기

 

아래와 같은 XML 파일을 작성하는 예제를 진행하겠습니다.

 

<?xml version="1.0" encoding="utf-8"?>

<Students>

  <Student Number="1" Name="김동영">

    <Score>

      <Korean>10</Korean>

      <English>20</English>

      <Math>30</Math>

      <Science>40</Science>

      <Music>50</Music>

      <Art>60</Art>

    </Score>

  </Student>

</Students>

2 작성할 XML 내용

 

XmlDocument doc = new XmlDocument();
 
//"<?xml version='1.0' ?>" 생략 가능
doc.LoadXml("<Students></Students>");
 
//XmlElement rootElem = doc.CreateElement("Students");
//doc.AppendChild(rootElem);

3 루트 생성

먼저 XmlDocument 개체를 생성합니다. LoadXml 메서드를 호출하게 되면 XML 형식의 문자열을Load 할 수 있습니다. 혹은 Students Element를 직접 생성해서 자식 Element로 설정 할 수 있습니다.

 

 

 

 
XmlElement newElem = doc.CreateElement("Student");
           
XmlAttribute newAttr = doc.CreateAttribute("Number");
newAttr.Value = "1";
newElem.Attributes.Append(newAttr);
 
newAttr = doc.CreateAttribute("Name");
newAttr.Value = "김동영";
newElem.Attributes.Append(newAttr);
 
…
 
doc.DocumentElement.AppendChild(newElem);

4 Student 노드 생성 및 Attribute 정의

먼저 XmlDocument 클래스의 CreateElement 메서드를 호출하여 Student Element를 생성합니다. Student Attribute“Number”“Name”을 가지고 있기 때문에, XmlDocument 클래스의 CreateAttribute 메서드를 통해 Attribute 개체를 생성합니다. “Number” Attribute에는 “1”, “Name” Attribute에는 김동영이라는 값으로 설정하였습니다. 생성한 Attribute는 해당 Element Attributes 속성에 있는 Append 메서드를 이용해 붙이게 됩니다. 생성한 Student Element는 루트 개체인 DocumentElement 속성의 자식으로 설정합니다. DocumentElement는 첫번째 Element를 가리킵니다.

 

 

 

XmlElement subNode = doc.CreateElement("Score"); XmlElement score = doc.CreateElement("Korean"); score.InnerXml = "10"; subNode.AppendChild(score); score = doc.CreateElement("English"); score.InnerText = "20"; subNode.AppendChild(score); score = doc.CreateElement("Math"); score.InnerText = "30"; subNode.AppendChild(score); score = doc.CreateElement("Science"); score.InnerText = "40"; subNode.AppendChild(score); score = doc.CreateElement("Music"); score.InnerText = "50"; subNode.AppendChild(score); score = doc.CreateElement("Art"); score.InnerText = "60"; subNode.AppendChild(score); newElem.AppendChild(subNode);

5 Score 노드 생성 및 과목별 점수 노드 생성

Student Element를 생성하는 것과 동일하게 XmlDocument 클래스의 CreateElement 메서드를 호출하여 Score Element를 생성합니다. <Node> </Node> Node 안에 값을 작성하기 위해서는 XmlElement 개체의 InnerText 속성을 정의하면 됩니다. 생성한 Element Score Element의 자식 Element 이기 때문에 AppendChild 메서드를 이용해 뒤쪽에 붙여줍니다.

 

InnerXml 속성을 이용해 <XML></XML>” 값을 설정하면 아래와 같습니다. Node1 Element InnerXml, Node2 Element InnerText에 값을 설정 하였습니다. InnerText를 실제로 보면 “<XML></XML>” 이라는 문자열이 값으로 설정됩니다.

<Node1>

        <XML>

        </XML>

</Node1>

<Node2>&lt;XML&gt;&lt;/XML&gt;</Node2>

6 InnerText InnerXml의 차이

 

 

 

XmlDocument 클래스의 InnerXml 속성에 접근하여 작성한 XML을 확인 할 수 있습니다. 파일로 내보내기 위해서는 XmlTextWriter 클래스를 이용합니다. XmlTextWriter 개체의 Formatting 속성을 Formatting.Indented로 설정하면 XmlTextWriter 개체의 속성 Indentation IndentChar 값으로 자식 요소가 들여쓰기가 되어 저장됩니다.

 
using (XmlTextWriter writer = new XmlTextWriter(xmlFilePath, Encoding.UTF8))
{
    writer.Formatting = Formatting.Indented;
    doc.Save(writer);
}

7 XML 파일로 작성

 

 

 

2.  XmlDocument 클래스를 이용해 XML 읽기 및 수정

XmlDocument 개체를 이용해 위에서 작성한 XML 파일의 데이터를 읽기 및 수정하는 방법입니다. 예제에서는 XML 파일에 접근 하므로 XmlDocument Load 메서드를 이용하였습니다.

 

 
XmlDocument doc = new XmlDocument();
doc.Load(xmlFilePAth);

8 XmlDocument 개체 생성 및 Load 메서드 호출

Load 메서드를 호출한 후 InnerXml 속성을 확인하여 XML 내용이 제대로 메모리에 로드가 되었나 확인 할 수 있습니다.

 

 

 

XmlNodeList stuNodes = doc.SelectNodes("Students/Student");
 
foreach (XmlElement stuNode in stuNodes)
{
    Console.WriteLine("학생의 이름 : {0}", stuNode.Attributes["Name"].Value);
    Console.WriteLine("학생의 번호 : {0}", stuNode.Attributes["Number"].Value);
 
    foreach (XmlElement scoreNodes in stuNode.ChildNodes)
    {
        Console.WriteLine("영어 점수 : {0}", scoreNodes["English"].InnerText);
        scoreNodes["English"].InnerText = "-100";
        Console.WriteLine("영어 점수 -100으로 변경");
    }
}

9 Student 노드의 Attribute Child Node에 접근

XmlDocument 클래스의 SelectNodes 메서드를 이용해 Node들을 검색합니다. SelectNodes 메서드는 Xpath 식과 일치하는 노드의 목록을 검색합니다. Students의 노드에서 하위인 Student 를 검색하고 싶다면

"Students/Student" XPath를 인자로 넘깁니다. 

맨 처음에 검색될 노드만 찾고자하면 SelectSingleNode 메서드를 이용하면 됩니다. ※더 자세하게 “Xpath 탐색을 사용하여 노드를 검색하고자 한다면 를 클릭해서 MSDN에서 확인하십시오

 

 Attribute는 노드의 Attributes 개체에서 인덱싱을 통해 접근 할 수 있습니다.

 

Attribute는 노드의 Attributes 개체에서 인덱싱을 통해 접근 할 수 있습니다.

 

Student 노드의 하위 노드는 ChildNodes 속성에 인덱싱을 통해 접근 할 수 있습니다.

 

 

 

doc.Save(xmlFilePAth);

10 XML 파일 수정

Load XML파일 경로를 이용해 Save 메서드를 호출하면 변경된 내용이 저장되는 것을 확인 할 수 있습니다.

 

 

 

 

 

/// <summary>
/// Student XML 파일의 내용을 하나씩 접근하여 출력합니다.
/// </summary>
/// <param name="xmlFilePAth"></param>
private static void PrintStudentXml(string xmlFilePAth)
{
    XmlDocument doc = new XmlDocument();
    doc.Load(xmlFilePAth);
 
    XmlNodeList nodes = doc.SelectNodes("Students/Student");
    Console.WriteLine(TabInsertToHead("<Students>", 0));
 
    foreach (XmlElement node in nodes)
    {
        Console.Write(TabInsertToHead("<Student", 1));
 
        //Student Attribute
        foreach (XmlAttribute attr in node.Attributes)
        {
            Console.Write(" {0}={1}", attr.Name, attr.Value);
        }
        Console.WriteLine(">");
 
        //Student Score Element
        foreach (XmlElement stuScore in node)
        {
            //Student Score Child Element
            foreach (XmlElement score in stuScore)
            {
                Console.Write(TabInsertToHead("<", 2));
                Console.Write(score.Name);
                Console.Write(">");
 
                Console.Write(score.InnerText);
 
                Console.Write("</");
                Console.Write(score.Name);
                Console.WriteLine(">");
            }
        }
 
        Console.WriteLine(TabInsertToHead("</Student>", 1));
    }
 
    Console.WriteLine(TabInsertToHead("</Students>", 0));
}
 
/// <summary>
/// 문자열 앞 부분에 Tab을 tabCount 만큼 삽입합니다.
/// </summary>
/// <param name="str"></param>
/// <param name="tabCount"></param>
/// <returns></returns>
private static string TabInsertToHead(string str, int tabCount)
{
    StringBuilder sb = new StringBuilder();
    for (int i = 0; i < tabCount; i++)
    {
        sb.Append("\t");
    }
    sb.Append(str);
 
    return sb.ToString();
}

11 Attribute Element에 접근

XmlDocument 개체의 InnerXml 속성에 접근하면 쉽게 출력 할 수 있지만, XML 노드 및 속성에 각각 접근할 수 있음을 나타내기 위해 작성하였습니다.

 

 

 

+ Recent posts