2012년 7월 9일 월요일

XML 데이터를 읽어올수 있는 C# 클래스 자동생성하기

예전에 작성해놨던 작업일지에 보니 이게 있네요. 그래서 까먹기전에 재빨리 포스팅합니다. 뭐 혹시 다른 분께 도움이 될 수도 있으니....

XML 파일을 그대로 읽어올 수 있는 C# 클래스를 자동으로 생성하는 것... 예전에 CAT 릭을 사용한 애니메이션 데이터를 3DS Max에서 읽어와서 Unity안에서 쓰려고 할 때 시도해봤던 겁니다. FBX파일을 CAT 릭에서 IK를 사용한 애니메이션 데이터를 제대로 export하지 않거든요. FBX에서에서 돌게하는 유일한 법은 애니메이션을 각 프레임 별로 bake하는건데 전 key frame 정보를 사용하고 싶었어요. 그래서 FBX 대신에 3DS Max에서 곧바로 XML 파일로 애니메이션을 저장할 수 있는 자체 기능을 써볼려고 했죠.

XML 파일을 저장해낸 뒤에 이 파일을 한번 문서편집기에서 열어봤죠. 데이터 구조가 그리 복잡하지 않다면 XML 파일을 곧바로 deserialize할 수 있는 C# 클래스를 손수 작성할수 있을거라 생각했거든요. 근데.... 그게 아니더군요.. 너무 복잡해요 -_-;;; 그래서 다음으로 생각한게.. '이걸 자동으로 해주는 툴이 있지 않을까?' 하는 것...

구글에서 검색을 해보니 스택오버플로우 에서 비주얼 스튜디오에 딸려나오는 xsd.exe을 이용하면 이게 가능하더다군요:
뭐 결국 제가 실행해야할 컴맨드라인 명령은 다음 두 줄 뿐이었습니다.

xsd test.xml /classes -> test.xsd
xsd test.xsd /classes -> test.cs

첫째 라인은 XML 파일로부터 XML 스키마 파일을 만드는거구요. 두번째 라인은 스키마 파일로 부터 C# 클래스를 생성하는 겁니다. 일단 test.cs 파일을 만든 뒤에 제가 할 일은 C#에서 자체적으로 지원하는 XML Serializer를 이용해서 C# 개체로 모든 데이터를 읽어오는 게 전부였죠. 대충 이렇게 보이는 코드입니다.

XmlSerializer x = new System.Xml.Serialization.XmlSerializer(typeof(test));
FileStream stream = File.Open(@"test.xml", FileMode.Open);
var a= (test)x.Deserialize(stream);

매우 간단하죠? 저도 너무 간단해서 놀랐어요 -_-;;; 근데 불행히도 XML 파일에서 제가 원하던 키프레임 정보를 읽어올 수 있어서..... 결국 사용하지 않았죠.. 뭐든간에... 알아두면 유용한 지식!


댓글 2개:

  1. 오오오오오오옷! 포프아저씨가 블로그에 포스팅한 글중에 정말 나한테 필요한 최고의 포스팅이었으요.
    진작 이런걸 알려주지-o-+

    답글삭제
    답글
    1. 역시 제가 뻘짓을 하고 놀아야... 경배님에게 도움이 되는거군요.. 열심히 하겠습니다.. 연두를 저에게 주세요 대신 -_-

      삭제