본문 바로가기
프로그래밍

초간단 xml 파싱 -> 직렬화

by 건우아빠유리남편 2011. 4. 21.
반응형

C#에서 Serialize 하여 XML읽기 #
아래와 같은 값을 가지는 객체를 인스턴스화 하고, 여기에 값을 채우고 싶다
class testClass
{
  [XmlElement]
  public string type;
  [XmlElement]
  public int data;
}

serialize하여 값을 채운다

//스트림으로 데이터를 읽어오자
Stream reader= new FileStream("test.xml",FileMode.Open);
//직렬화 하기 위해서 타입을 알아야 한다.
XmlSerializer serializer = new XmlSerializer(typeof(testClass));

//시리얼라이저가 test.xml'에 정의된 대로 instance를 만들어 준다. 이로써 이미 파싱은 끝났다.
testClass instance = (testClass)serializer.Deserialize(reader);

단 이때 당연히! xml문서의 구조가 위의 testClass와 동일해야 한다.

<?xml version="1.0"?>
<testClass>
  <type>book</type>
  <data>12</data>
</testClass>

문서 구조와 클래스 구조가 틀리면 런타임시 틀린 줄 까지 표시해주니 디버깅도 아주 쉽다.
<DeSerialize>할 클래스 선언 자체가 xml 정의가 되므로 따로 스키마나 dtd를 정해줄 필요가 없다.

[출처] c# - XML introduce|작성자 티거


-실제 적용-
콘솔로 테스트 해보았다.  우왕ㅋ굳


냐옹이.xml 파일 내부

<?xml version="1.0" encoding="utf-8"?>
<queryxml xmlns="http://www.Nyaonge.co.kr/XMLSchema">
    <query queryid="selectEmp">
        <commandtext><![CDATA[Select * from emp]]></commandtext>
    </query>
    <query queryid="SelectEmpByEmpNo">
        <commandtext><![CDATA[SELECT * from emp where empno = @empno></commandtext>
        <parameters>
            <param direction="Input" dbtype="VarChar" size="32">empno</param>
        </parameters>
    </query>
    <query queryid="selectEmpLessthan10">
        <commandtext><![CDATA[select * from emp where empno < 10]]></commandtext>
        <parameters>
            <param direction="Input" dbtype="VarChar" size="32">empno</param>
        </parameters>
...
</queryxml>



    [XmlRootAttribute("queryxml", Namespace = "http://www.Nyaonge.co.kr/XMLSchema")]
    public class XmlObj
    {
        [XmlElement("query")]
        public QueryXml[] queryxml;
    }
   
    public class QueryXml
    {
        [XmlElement("commandtext")]
        public string commandtext;
        [XmlElement("parameters")]
        public Parameters parameters;
   
    }

    public class Parameters
    {
        [XmlElement("param")]
        public string[] parameter;
    }
   
    class Program
    {
        static void Main(string[] args)
        {
            //스트림으로 데이터를 읽어오자
            Stream reader = new FileStream("냐옹이.xml", FileMode.Open);
            //직렬화 하기 위해서 타입을 알아야 한다.
            XmlSerializer serializer = new XmlSerializer(typeof(XmlObj));

            //시리얼라이저가 test.xml'에 정의된 대로 instance를 만들어 준다. 이로써 이미 파싱은 끝났다.
            XmlObj instance = (XmlObj)serializer.Deserialize(reader);
            foreach (QueryXml qx in instance.queryxml)
            {
                Trace.WriteLine(qx.commandtext);
                Trace.WriteLine(qx.parameters);
            }

            Console.ReadLine();
        }
    }

반응형

댓글