XmlTextReader 클래스를 이용한 XML파일 읽기

이번에는 XML파일을 XmlTextReader 클래스를 이용하여 읽는 방법에 대해 살펴보도록 하자.

읽고자하는 XML 파일
<?xml version="1.0"?>
<!--This file stores application version list-->
<Programs>
  <Program>
    <ID>ZemnaAutoUpdater</ID>
    <Name>Zemna Auto Updater</Name>
    <Contents>하하하하하</Contents>
    <RegistrationDate>2009-02-27 오전 11:28:02</RegistrationDate>
    <Versions>
      <Version>
        <VersionNo>1.0.0</VersionNo>
        <RegistrationDate>2009-02-27 오전 11:28:02</RegistrationDate>
        <EditDate>2009-02-27 오전 11:28:02</EditDate>
        <FolderPath>cadfasd</FolderPath>
        <Files>
          <File>123.tx</File>
        </Files>
      </Version>
    </Versions>
  </Program>
</Programs>

위 파일을 읽는 코드는 아래와 같다.

XmlTextReader로 파일 읽기 샘플
List<ProgramInfo> IDataProcessor.LoadList(string filePath)
{
    // 데이터를 저장 할 변수 선언
    List<ProgramInfo> listPrg = null;

    int piIdx = 0;  // Last ProgramInfo Index
    int viIdx = 0;  // Last VersionInfo Index

    XmlTextReader reader = new XmlTextReader(filePath);

    // 공백을 처리하지 않음
    reader.WhitespaceHandling = WhitespaceHandling.None;

    while (reader.Read())
    {
        reader.MoveToContent();

        if (reader.NodeType == XmlNodeType.Element)
        {
            switch (reader.Name)
            {
                case "Program":
                    if (listPrg == null)
                        listPrg = new List<ProgramInfo>();
                    ProgramInfo pi = new ProgramInfo();
                    listPrg.Add(pi);
                    piIdx = listPrg.Count - 1;
                    break;
                case "ID":
                    listPrg[piIdx].ID = reader.ReadString();
                    break;
                case "Name":
                    listPrg[piIdx].Name = reader.ReadString();
                    break;
                case "Contents":
                    listPrg[piIdx].Contents = reader.ReadString();
                    break;
                case "RegistrationDate":
                    if (reader.Depth == 2)
                        listPrg[piIdx].RegistrationDate = Convert.ToDateTime(reader.ReadString());
                    else
                        listPrg[piIdx].Versions[viIdx].RegistrationDate = Convert.ToDateTime(reader.ReadString());
                    break;
                case "Version":
                    if (listPrg[piIdx].Versions == null)
                        listPrg[piIdx].Versions = new List<VersionInfo>();
                    VersionInfo vi = new VersionInfo();
                    listPrg[piIdx].Versions.Add(vi);
                    viIdx = listPrg[piIdx].Versions.Count - 1;
                    break;
                case "VersionNo":
                    listPrg[piIdx].Versions[viIdx].VersionNo = reader.ReadString();
                    break;
                case "EditDate":
                    listPrg[piIdx].Versions[viIdx].EditDate = Convert.ToDateTime(reader.ReadString());
                    break;
                case "FolderPath":
                    listPrg[piIdx].Versions[viIdx].FolderPath = reader.ReadString();
                    break;
                case "File":
                    if (listPrg[piIdx].Versions[viIdx].FileList == null)
                        listPrg[piIdx].Versions[viIdx].FileList = new List<string>();
                    listPrg[piIdx].Versions[viIdx].FileList.Add(reader.ReadString());
                    break;
            }
        }
    }

    reader.Close();

    return listPrg;
}

Leave a Reply