페이지

2013년 1월 28일 월요일

xml catalog in Eclipse

xml catalog in Eclipse

History

  • 2013-01-28, initial version
  • 2013-06-04, using catalogue extension point

overview

eclipse는 xml의
  • element나 attribute의 자동완성 기능
  • validation 기능
을 제공한다. 이 기능을 사용하기 위해서는 그 xml문서의 문법책이라고 볼 수 있는 dtd 혹은 xsd파일이 있어야 한다.
보통 이런 xsd 파일은 http로 공개되어져 있고 eclipse 같은 훌륭한 IDE에선 그 파일을 가져와서 xml 파일은 validation할 수 있다.
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
...
위 maven xml의 경우 http://maven.apache.org/xsd/maven-4.0.0.xsd 에 xsd가 있다. 그래서 대부분의 경우 xsd가 resolve가 되면 validation이 가능하다.
하지만 특정한 경우에 xsd를 override하고 싶은 경우가 있을 수 있다. 예를 들면
  • 내부 테스트 환경에서는 xsd위치가 다르다거나
  • 로컬에서 xsd를 바꿔가며 테스트 해보고 싶은 경우
  • 서버 이상으로 xsd에 접근을 못할 경우
그럴때 eclipse에서의 xml catalog를 사용해서 xsd를 override 할 수 있다.

xml fundamental

아래 설명을 이해하려면 최소한의 xml schema에 대한 지식이 있어야 한다.
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
   targetNamespace="http://example.org/publishing"
   xmlns:tns="http://example.org/publishing"
>

   <!-- type definitions -->
   <xsd:simpleType name="AuthorId">
      <!-- define value space details here -->
      ...
   </xsd:simpleType>

   <xsd:complexType name="AuthorType">
      <!-- define structural details here -->
      ...
   </xsd:complexType>

   <!-- global element/attribute declarations -->
   <xsd:element name="author" type="tns:AuthorType"/>
   <xsd:attribute name="authorId" type="tns:AuthorId"/>
   ...

</xsd:schema>
  • 위에서 xmlns:xxx는 xxx에대한 namespace정의다.
  • schema 에 있는 targetNamespace 는 이 스키마의 namespace가 http://example.org/publishing 이라는 것
  • xmlns:tns가 targetNamespace와 같은 것으로 한번 더 정의한 이유는 이 스키마 내부에서 특정 엘리먼트를 reference하기 위해서다. tns:AuthorType 이나 tns:AuthorId 처럼
위 xsd에 맞게 xml을 쓸때는 아래처럼 쓴다
<x:author xmlns:x="http://example.org/publishing"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://example.org/publishing pubs.xsd"
>
...
  • xmlns:x 가 위 xsd에서 정의한 nampspace이고 그것을 사용하고 있다
  • schemaLocation에서 <namespace> <xsd uri> pair를 한개 이상 정의할 수 있다

Defining xml catalog with dtd

Defining xml catalog with xsd

Preferences>XML>Xml Catalog 에서 xml catalog를 설정할 수 있다.
<c:Catalogue xmlns:c="http://www.eclipse.org/webtools/Catalogue" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.eclipse.org/webtools/Catalogue http://www.eclipse.org/webtools/Catalogue/Catalogue.xsd ">
    <c:Book>
        <title>Professional XML Schema</title>
        <date>2001</date>
        <isbn>1-861005-47-4</isbn>
        <publisher>Wrox Press</publisher>
    </c:Book>
</c:Catalogue>
방법은 2가지
namespace name으로 할경우, xsi:schemaLocation은 xml에서 제거를 해야 동작한다
이렇게 정의한 xml catalog는 import/export도 가능하다.

Defining xml catalog using extension point

preference를 이용한 xml catalog는 설정은 자신의 eclipse workspace에만 적용되는 local한 것인 한계가 있다. 내가 개발한 plugin을 사용하는 사람에게 설정을 해주고 싶다면 extension point를 이용해서 설정을 하는것도 가능하다.
org.eclipse.wst feature에 있는 "org.eclipse.wst.xml.core.catalogContributions" extension point를 이용하면 된다. 예제는 org.eclipse.wst.standard.schemas plugin의 소스를 import해서 살펴보면 어떻게 정의하고 사용하였는지 알 수 있다.

ex>
             point="org.eclipse.wst.xml.core.catalogContributions">
                        id="org.tizen.nativecpp.misc.manifest.catalog">
                              name="http://schemas.tizen.org/2012/12/manifest"
                  uri="xsd/manifest.xsd">