Skip Navigation Links.
Expand VBAVBA
엑셀프로그래밍이 필요한 이유
Expand ExcelExcel
Expand External LibraryExternal Library
Expand SolutionSolution
Expand EssayEssay

External Datas - XML_02


Schema화일|XSD화일이 뭔가 ??

  • Schema File|XSD
  • XmlMap
  • Schema
  • 억세스화일을 이용하여 XML화일과 XSD화일을 만든다!!


잠깐 돌발 퀴즈!!..
아래의 그림과 같이 EVAL이라는 사용자정의 함수를 작성했는데
결과값이 의도한대로 안나온다는 질문이 있다..
댐박에 알아내면 고수..
한참 머리를 꺄우뚱거리면 하수..




사용자정의 함수의 결과값이 Long으로 데이타타입으로 되어있으니
당연하다..Long타입은 정수만 나타낸다..
그러니 소숫점 뒷자리는 날라가 버리니 그렇게 되는 것이 당연
함수의 결과값을 Long에서 Single로 바꾸면 된다

주간강좌를 막을 내리니 간단한 질문에 대한 답을 어디에 올릴 곳이
없어 졌다
당분간 이곳에 올릴 것이니..그렇게들 아시고 잘 챙기시기를..!!

------------------------------------------------------------------

다시 본론으로 돌아가서
XML문은 다시 말해서
텍스트문서를 어떤 서로가 알아볼수 있는 패턴으로 작성한것!!
그 이상도 그 이하도 아니다!!
예를 들어서 텍스트 문서를

횽길동|남자|1975/3/3|서울

이라고 | 로 구분하여 표시를 하는 사람도 있고

홍길동^남자^1975/3/3^서울

이라고 ^로 구분하여 표시를 하기도 하고
이렇게 하면 이 정보를 받아 보는 곳에서 일일이 형식에 대하여
설명을 해주어야 할것이고
이문자열 정보에서 필요한 정보를 빼어내는 (Parsing)코딩을
일일이 작성해야 할것이다
그러니 공통적으로 어떤 약속된 형태로 꼬리표(TAG)로
표시하면 어떻게느냐~!!!!라는 것이 XML문서가 되는 것이다
실질적인 예를 들어서 아래와 같이



UNO-Tools의 코드를 잠거 놓고
멤버인지 확인하는 절차에서..
멤버들은 자신의 패스워드와 이메일을 입력하면
입력된 정보(이메일과 패스워드)는 어디로 가는가??
uno21.com웹싸이트의 아래 페이지를 호출하게 된다

http://uno21.com/admin/unosolution/unoenglishpassword.aspx?password=***&email=***

이 웹페이지에서 ADO.NET이라는 DAO나 ADO와 같은 형제지간인
오브젝트들이 데이타베이스를 찾아서 ADO.NET의 오브젝트중의
하나인 DataSet이라는 녀석의 메소드 GetXML()이라는 녀석이
데이타베이스에서 얻어낸 정보로 XML문을 만들어서
내보내게 되고 이 XML문을 받아낸 VBA에서 읽어서 처리하는 것이다

또한 2007버전의 메뉴(리본)의 구성을 사용자정의(Customizing)도
XML문으로 구성한다..왜냐하면 사용자의 가독성을 좋게하여 !!
그냥 TAG에 맞추어서 입력하여 보관하면 되니까..



아무튼 ..지난시간에 하였던 것을 계속 해보면

XML을 갖여 오는 메뉴얼적 방법은 3가지가 있고



그중의 하나는 목록으로 갖여오는 것이고
또하나는 읽기 전용의 문서자체를 여는 것이고(TXT,CSV화일열듯이)
세번째는 데이타없이 원본구조,Schema(XML Map을 갖여 오기)만을 갖여 오는 것
위의 3개의 경우는 모두 메뉴얼 작업으로 새로운 통합문서가 열리면서
이루어지는 것이였고
위의 내용은 메뉴얼로 작업하면서 매크로기록기에 의하여
만들어진 구문이고 별도의 통합문서가 열리게 되는 내용이다

그런데 헷갈리는 것이 있다..
XML문서를 갖여 올때([읽기전용]으로 갖여올때는 필요없고..) 항상
메시지가 하나 뜬다!!
[지정한 XML원본이 스키마를 참조하지 않습니다 Excel에서 원본데이타를
사용하여 스키마를 만듭니다!!]

라는 메시지가 뜨는것이고 ..[스키마]라고 하는것이
어디엔가 만들어진다는 소리다..
이것이 없이는 아무것도 할수 없다는 소리다

지난 시간의 화일에서 VBA로 하였던 것은
별도의 통합문서가 열리는 것이 아니고 VBA가 실행되는 해당통합문서의 시트에
불러 오는 작업을 하고 있는 중이였다
이때도 실행중에 같은 메시지박스가 떴었었다
이때도 역시 스키마를 만든다는 것이다
지난 시간에
XML목록을 시트에 불러 오는 작업을 아래와 같이 했었다 Thisworkbook.importXML()
메소드로 xml정보를 갖여 와서 시트에 뿌려 주었었다
눈썰미가 있으신 분들은 몇번을 Thisworkbook.importXML문을
실행하다 보면..
무언가 쌓이는 것을 발견했을수도 있을 것이다
지난 번 화일에서 몇번을 XML정보를 갖여 온후
직접실행창에 아래와 같이 해보면



와 같이 XmlMap개체가 5개가 만들어 졌음을 알수 있다



엑셀은 XML정보를 갖여올때 항상 XML문서의 구조화일,Schema화일을 찾는다
XML문서는 데이타만 갖고 있는 것이고..
XML문서로만 존재하여도 되지만..엑셀에서 불러 들일때는
꽤나 까다롭게 따지는 것이고..따지는 이유는 정보의 유효성을 유지하기
위한 것이다
예를 들어서 날자정보가 들어오거나 내보내는데 ..
날자정보가 아닌 문자정보를 주고 받으면 안되는 검문소같은 일을
하는 것이 스키마화일인것이다
이 데이타의 구조를 규정하는 화일..데이타의 타입..유효성등을
정해놓는 화일(XSD확장자로 된 역시 같은 XML형식의 화일)을 찾는다
이것을 기본적으로 올려 놓은후 해당 정보를 XML화일에서 갖여오는 것이다
그런데 ..XML화일이 데이타만 있고 schema화일이 없다
그래서 엑셀이 알아서 자동으로 작성하게 되고 이것을 xmlMap이라는 오브젝트가
보관하게 된다
즉 xmlMap은 schema이고 xsd화일인 셈이다



thisworkbook.XmlMaps(1).Schemas(1).XML

구문으로 얻어지는 문자열 정보를 제대로
정리해서 보면..아래와 같다
정보의 Type="string" 정보의 휠드명은 name="customer"등과 같이
테이블의 설계도가 schema인것이다
이것을 별도로 보관할때 XSD확장자로 저장하고 스키마화일이라고 부른다

엑셀 어려워서 못하겠네...#@$@하실려나..
실은 이런 것 그렇게 깊이 알 필요 없다
원리가 어떻다는 것만 알면 되는 것이다

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <xsd:element nillable="true" name="orders"> <xsd:complexType> <xsd:sequence minOccurs="0"> <xsd:element .... name="order" ....> <xsd:complexType> <xsd:sequence minOccurs="0"> <xsd:element .... type="xsd:string" name="customer" ...> </xsd:element> <xsd:element ....type="xsd:string" name="phone" ....> </xsd:element> <xsd:element ....type="xsd:string" name="employee" ...> </xsd:element> <xsd:element ...type="xsd:string" name="product" ...> </xsd:element> <xsd:element ...type="xsd:string" name="time" ...> </xsd:element> </xsd:sequence> </xsd:complexType> </xsd:element> </xsd:sequence> </xsd:complexType> </xsd:element> </xsd:schema>

그런데 XmlMap의 스키마오브젝트의 XML문을 읽어 보시면
날짜정보인데..몽땅..String으로 데이타타입이 정해져있음을 알수 있다
이것은 XML데이타상에서 날짜일지라도 엑셀에 읽어서 만든
스키마는 별로 믿을 만한 것이 아니라는 점이다!!!
이것까지 알아서 읽어서 분석하기에는 일이 너무 많으니
엑셀도 포기하고 ..그냥 몽땅 문자열정보(String)으로 처리해 버린다
스키마화일은 있어야겠고..사용자는 스키마화일을 제공하지 않고
(XML화일에서 스키마화일을 참조하지 않고)
그러니 형식만 갖춘 스키마화일을 작성하는 셈인것이다

그럼 제대로 된 스키마화일을 어떻게 만들수 있을까??
복잡하게 생긴것을 배워가면서 일일이 작성해야 할까???!!
아니다...!!
억세스라는 녀석이 또 활약을 해준다
아래와 같이 해보시기 바란다
Northwind.mdb도 좋고..사용하시는 아무 억세스화일에서나
테이블 혹은 쿼리 아무것이나 XML화일로 만들고 싶은 것을
선택후 ..그림과 같이..



위와 같이 하면 아래와 같이 두개의 화일이 생성된다
하나는 XML화일 하나는 스키마화일(XSD)가 만들어지는것이다
XML화일을 열어보면 처음 선언부에 참조하는 스키마화일의 이름과
주소가 지정이 되어있음을 볼수 있을것이다



이 XML화일을 엑셀에서 열면 자동으로 스키마화일을 참조하고
쓸데없는 대화상자를 열지 않게 되고..
척하고 엑셀시트에 뿌려지게 된다
엑셀에서 테이블을 만들고 이것을 억세스로 보내고
이것을 XML화일로 내보내면 XML,XSD화알을 만들수 있다는
이야기가 된다!!
아휴...너무 길다..
다음 페이지에서 연속하자!!!
참..!!이렇게 복잡한것을 해야 되요??!!
우노는 하지 않는다..
왜냐하면 VBA로 처리하면 되니까...
그런데 왜 이렇게 복잡하게 장황하게 떠드는가??
이렇게 복잡한 짓을 왜 하느냐??!!를 이해시키기 위하여서다..
다음 시간에 또!!!!
너무 떠들다 보니까..이번 페이지에는 VBA화일 없다