태터데스크 관리자

도움말
닫기
적용하기   첫페이지 만들기

태터데스크 메시지

저장하였습니다.
   情  
Front Page
Tag | Location | Media | Guestbook | Admin   
 
'XML'에 해당하는 글(7)
2009.10.25   [Silverlight] XML 파일 읽기 (1)
2008.09.12   XML 네임스페이스
2008.09.12   DTD문서 작성법3 (Entity, 컨티셔널 섹션)
2008.09.12   DTD문서 작성법 2 (속성작성, 노테이션)
2008.09.10   DTD문서 작성법 1 (엘리먼트가 가지는 데이터 유형 정의)
2008.09.10   XML 기초 2
2008.08.30   XML 기초 1


[Silverlight] XML 파일 읽기

원격지에 있는 XML파일, 그리고 xap에 포함되어 배포된 XML파일 모두 Silverlight에서 손쉽게 읽을 수 있습니다.

원격지에 있는 XML파일 읽기

접근가능한 특정 원격지에 XML파일은 WebClient를 통해 손쉽게 접근, 사용하실 수 있습니다.

public MainPage()
{
    InitializeComponent();
    WebClient wc = new WebClient();
    wc.DownloadStringCompleted += new DownloadStringCompletedEventHandler(wc_DownloadStringCompleted);
    wc.DownloadStringAsync(new Uri("http://주소/Contact.xml", UriKind.Absolute));
}

void wc_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e)
{
    //XElement 또는 XDocument를 이용하여 전송받은 XML String를 Parsing 한 다음 사용하시면 됩니다.
    XElement xContact = XElement.Parse(e.Result);
}

한 가지 주의사항이 있다면 해당 XML자원이 XAP파일이 포함된 폴더 밖에 있다면, ‘상호 도메인 정책 파일’ 역시 해당 서버에 올려져 있어야 한다는 점입니다. Silverlight는 기본적으로 원격지에 접근할 때에는 ‘clientaccesspolicy.xml’나 ‘crossdomain.xml’ 등의 ‘상호 도메인 정책 파일’이 있는지 검사를 합니다. 만약 ‘상호 도메인 정책 파일’이 없거나 권한이 없다면 Exception을 발생시킬 것입니다.

절대경로를 통해 원격지에 있는 WebServer에 XML파일을 요청하는 것이라 할 지라도 xap가 포함된 폴더나 그 하위에 있는 자원이라면 ‘상호 도메인 정책 파일’이 없어도 문제없이 동작합니다.

xap파일에 포함되어 배포되는 xap파일 읽기

XElement, XDocument의 Load 옵션을 통해서 간단하게 읽으시면 됩니다.

XDocument xContact = XDocument.Load("Asset/XML/Contact.xml");

참~ 쉽죠?

신고
Tag : Silverlight, XML
Commented by Favicon of http://slx.co.kr BlogIcon Kongpill at 2009.10.26 09:41 신고  r x
일요일에도 공부하는겨? +_+!

name    password    homepage
 hidden


XML 네임스페이스

XML로 만들어진 여러 마크업언어를 혼합하여 사용할 수 있는데, 그럴 경우 발생하는 문제가 바로 엘리먼트 이름의 충돌이다. 흔히 이런 류의 문제는 네임스페이스라는 것을 선언해서 해결하게된다.

  • xml에서 네임스페이스는 URI(Uniform Resource Identifier)형태로 제작된다. URI형태로 제작하는 것이, 기존의 네임스페이스와 새로 정의될 네임스페이스의 충돌을 최소화할 수 있기 때문이다.
  • xml로 제작된 각 마크업언어는 하나의 네임스페이스를 가질 수 있다. (물론 가지지않을 수 도 있다.)
  • XML Schema를 이용해서 마크업언어를 작성할 경우, 네임스페이스 값은 어떻게 할 것이며 네임스페이스를 반드시 선언해야하는냐 등을 정의 할 수 있는 문법을 제공한다. Schema에서 네임스페이스를 반드시 사용하도록 지정했다면, xml문서에서 해당 네임스페이스를 선언하고 사용해야한다.

네임스페이스 선언

  • 네임스페이스를 사용하도록 만들어졌다면, 각 엘리먼트의 접두사로 네임스페이스 명이 사용되어야한다. 하지만 URI형태로 제작된 네임스페이스를 필요할 때마다 사용하는 것은 비효율적이다. 그리고 네임스페이스 값 자체가, xml에서 사용하기 곤란한 문자들을 다수 포함하기에, 네임스페이스를 대신하는 별칭을 선언하여 사용하게 된다.
    <!--네임스페이스 선언-->
    <접두사:엘리먼트명 xmlns:접두사="네임스페이스명">

    <!--네임스페이스 사용-->
    <접두사:엘리먼트명></접두사:엘리먼트명>
  • 접두사의 작명규칙은 xml의 일반적인 작명규칙과 동일하다.
  • '접두사:엘리먼트명'은 QName(Qualified name)라고 하며, XML해석기는 QName을 하나의 엘리먼트명으로 간주하게 된다.
  • 네임스페이스를 선언하는 엘리먼트 부터, 그 엘리먼트의 모든 자식 엘리먼트까지 네임스페이스의 적용 범위가 된다.
  • 여러 네임스페이스를 선언하는 경우는 다음과 같다. 한가지 알아 둘 점은, 네임스페이스를 선언하는 엘리먼트가 무조건 해당 네임스페이스에 포함되는 엘리먼트가 아니여도 된다는 점이다. 즉, 하나의 루트 엘리먼트에 모든 네임스페이스 선언을 같이 해도 된다는 말이다.(그 루트엘리먼트가 선언하는 네임스페이스와 전혀 상관없더라도 말이다.) 다음 예제를 통해 알아보자.
    <!--
       여러 네임스페이스 선언
       루트엘리먼트는 A네임스페이스에 속하는 엘리먼트지만,
       루트엘리먼트에 다른 모든 네임스페이스를 선언하고있다.
       엘리먼트의 선언은 소속에 관계없이 어떤 엘리먼트에서도
       가능하지만, 사용은 반드시 소속엘리먼트에만 해야한다.
    -->

        
    <A:루트엘리먼트
          xmlns:A="A네임스페이스"
          xmlns:B="B네임스페이스"
          xmlns:C="C네임스페이스">
        <A:엘리먼트 />
        <B:엘리먼트>
           <B:자식엘리먼트 />
        </B:엘리먼트>
        <C:엘리먼트 />
  • Default Namespace : 하나의 마크업 언어를 사용할 경우, 굳이 네임스페이스를 위해 접두사를 모두 붙이는 것은 오히려 거추장스럽다. 이를 위해서 Default Namespace를 제공하고 있다.
    <!-- 
      Default Namespace는
      Namespace선언 시 접두사를 생략하면 된다.
    -->

    <엘리먼트명 xmlns="네임스페이스">
        <자식엘리먼트 />
    </엘리먼트명>
  • Default Namespace를 사용하면, 네임스페이스 범위의 모든 엘리먼트에 네임스페이스가 부여된 상태로 간주되는데, 네임스페이스에 속하지 않는 엘리먼트가 있을 경우나, 부분적으로 다른 네임스페이스에 속하는 엘리먼트가 올 경우 다음과 같은 문법을 사용해야한다.
    <!-- Default Namespace선언-->
    <루트엘리먼트 xmlns="네임스페이스">
        <!-- Default Namespace에 속하지 않는 엘리먼트-->
        <엘리먼트A xmlns="" />
        <!-- 다른 Namespace에 속하는 엘리먼트의 경우-->
        <엘리먼트B xmlns="네임스페이스B" />
    </엘리먼트>

    위에서, Default Namespace 범위안에 특정 엘리먼트들은 자신이 다시 네임스페이스를 선언함으로서, Default Namespace의 범위를 벗어났다. 그리고, 당연히 그 자식 엘리먼트들은 부모 엘리먼트의 영향을 받게 된다.
  • 속성과 Namespace : 속성도 Namespace의 적용을 받으므로, 접두사를 붙여야한다.
  • Default Namespace와 속성 : Default Namespace의 범위안에 속성은 Namespace의 적용을 받지 않는다. 따라서, 다음과 같은 방법으로 해결해야한다.
    <!-- 
    같은 네임스페이스 선언을 Default Namespace와 일반 Namespace방법 모두 선언함으로서, 속성이 Default Namesapce에 속하지 않는 문제를 해결한다. 속성은 Default Namespace에 속하지 않으므로, 속성 앞에는 접두사를 사용한다.
    -->

    <엘리먼트 
      xmlns="네임스페이스" 
      xmlns:접두사="네임스페이스">
        <자식엘리먼트 접두사:속성="값" />
    </엘리먼트>
  • XML Schema를 이용하여 새로운 마크업언어를 작성할 때, 네임스페이스 명과 네임스페이스에 대한 여러 옵션을 다룰 수 있지만, 여기서 그 내용을 기술하지는 않겠다.
신고
Tag : XML

name    password    homepage
 hidden


DTD문서 작성법3 (Entity, 컨티셔널 섹션)

Entity

Entity는 보통 엔티티가 사용되는 위치나 엔티티내용이 외부파일로 존재하는가에 등에 의해 여러가지로 분류되어진다.

  • 내부 엔티티 : 내부 엔티티란 DTD문서 내에서 텍스트형태로 정의된 엔티티를 말한다. 내부 엔티티는 내부 일반 엔티티와 내부 파라미터 엔티티로 구분되는데, 그 차이는 엔티티의 사용영역에 따른다.
    - 내부 일반 엔티티 : 내부 일반 엔티티는 일반적으로 xml문서에서 사용되는 엔티티를 말하며, '&'로 시작하고 ';'으로 종료되는, 예를 들어 &엔티티명;과 같은 형태를 띤다. 엔티티의 정의는 DTD문서내에서 정의되며, 사용은 xml문서에서 사용하게 된다.
        DTD문서
        <!ENTITY 엔티티명 "엔티티내용">
        XML문서
        <!-- 아래와 같은 선언은 DTD문서의 엔티티내용으로 대체된다. -->
        &엔티티명;
    - 내부 파라미터 엔티티 : 내부 일반 엔티티와 차이점은 내부 파라미터 엔티티는 DTD문서 내에서 사용된다는 점이다. 중복되는 문장을 내부 파라미터 엔티티를 이용하여 보다 간편하고 간결하게 표현될 수 있다.
        DTD문서
        <!--엔티티선언-->
        <!ENTITY % 엔티티명 "엔티티내용">
        <!-- 엔티티사용-->
        %엔티티명;
  • 외부 엔티티 : 외부 엔티티란 엔티티의 내용 부분만 외부의 파일 형태로 저장된 것을 말한다.(파일 확장자 상관없음) 내부 엔티티와 마찬가지로 일반과 파라미터로 분류된다. 한가지를 제외하고 내부 엔티티와 모두 같다. 그 차이점은 엔티티를 선언할 때 다음과 같이 선언한다는 점이다.
        <!ENTITY 엔티티명 SYSTEM "엔티티경로">
        <!ENTITY % 엔티티명 SYSTEM "엔티티경로">
    즉 엔티티내용 부분을 엔티티 내용이 저장된 파일의 경로로 대체하면 된다.
  • 내장(Built-in) 엔티티 : 내장 엔티티란 XML에서 미리 정의되어 제공하는 엔티티들을 말한다. 이 엔티티들은 미리 예약되어 있으며, 사용자는 내장 엔티티를 사용만하면 된다. 대표적으로 자주 사용되는 내장 엔티티는 다음과 같다.

    엔티티

    대체될 문자

    &amp; 또는 &#x0026; &
    &lt; 또는 &#x003C; <
    &gt; 또는 &$x003E; >
    &apos; 또는 &#0027; '
    &quot; 또는 &#0022; "
    &#x20; 공백
    &#xd; 캐리지 리턴
    &#xa; 라인피드
    &#x9;
    &#92; \
  • 외부 일반 언파스드 엔티티 : Unparsed, 말그대로 XML파서나 응용프로그램이 해석할 수 없는 비문자 데이터에 대한 엔티티를 지정할 수 있다. 이 엔티티를 이용하기 위해서는 해당 비문자 데이터 타입에 대한 Notation이 먼저 정의되어있어야한다. Entitiy 정의할 때, 해당 비문자 데이터의 경로를 지정하고, 그 타입을 Notation으로 지정하면 된다.
        DTD파일
        <!-- 사용될 비문자 데이터의 타입을 Notation으로 지정-->
        <!NOTATION jpg SYSTEM "painter.exe">
        <!-- ENTITY에서 해당 비문자 데이터 지정 및, 해당 파일의 형식을 Notation으로 지정-->
        <!ENTITY myPicture SYSTEM "myface.jpg" NDATA jpg>
        <!-- 엔티티를 사용할 엘리먼트의 속성 정의-->
        <!ELEMENT person EMPTY>
        <!ATTLIST person image ENTITY #IMPLIED>
        XML파일
        <!-- 지정한 엔티티의 사용-->
        <person image="myPicture" />

컨디셔널 섹션(Conditional Section)

DTD문서 내에서, 어떤 특정 영역을 DTD문서의 내용으로 포함할 것인지 무시하도록 할 것인지를 결정할 수 있는 방법이 Conditional Section이라고 한다. 기본적으로 컨디셔널 섹션에서 사용되는 문법은 다음과 같다.

<![(INCLUDE | IGNORE) [
    <!--이 곳에 컨디셔널 섹션이 적용될 DTD를 작성하면된다.-->
]>

컨디셔널 섹션의 영역이 동작하지 말지를 결정하는 것은, 결정자가 IGNORE인지, INCLUDE인지에 따른다. 말 그대로, INCLUDE는 포함, IGNORE는 무시하겠다는 의미가 된다. 위에서 (INCLUDE | IGNORE) 위치에 INCLUDE 혹은 IGNORE를 위치시켜야한다. 보통 보다 유연하게 사용하기 위해, IGNORE와 INCLUDE를 엔티티로 정의해두고, XML문서에서 내부 DTD 서브셋을 이용, 컨디셔널 섹션을 조작하게된다. 아래에 DTD와 XML문서 내용 예제가 있다.

DTD문서 - test.dtd

<?xml version="1.0" encoding="utf-8"?>
<!ENTITY % section1 "IGNORE">

<!ELEMENT member (student*)>
    <!ELEMENT student (name, tel)>
        <!ELEMENT name (#PCDATA)>
        <!ELEMENT tel (#PCDATA)>

<!--컨디셔널 섹션 시작-->
<![%section1;[
    <!ATTLIST student gender (male| female) #REQUIRED>
]]>

XML문서 - test.xml

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE test SYSTEM "test.dtd" [
    <!-- 컨디셔널 섹션을 포함하도록 한다. DTD내의 엔티티와 내부 DTD서브셋의
          엔티티가 중복될 경우 내부 DTD서브셋이 우선 적용된다.-->

    <!ENTITY % section1 "INCLUDE">
]>

<member>
    <student gender="male">
        <name>양현주</name>
        <tel>010-1111-1111</tel>
    </student>
</member>

신고
Tag : DTD, XML

name    password    homepage
 hidden


DTD문서 작성법 2 (속성작성, 노테이션)

엘리먼트에 속성 만들기

엘리먼트에 속성을 만들기 위한 문법으로는 아래와 같으며, 아래의 ATTLIST엘리먼트를 구성하는 요소 중에서 엘리먼트명, 속성명, 속성타입, 디폴트 정의 등 하나라도 생략될 수 없다.

-DTD파일 예제
<?xml version="1.0"?>

<!-- 엘리먼트 정의 -->
<!ELEMENT 엘리먼트명 유형>

<!-- 엘리먼트에 대한 속성 정의 -->
<!ATTLIST 대상엘리먼트명
        속성명 속성타입 디폴트정의
        속성명2 속성타입2 디폴트정의2
        ...
        속성명n 속성타입n 디폴트정의n>

속성명 작성

속성명은 해당 엘리먼트에 부여되는 속성의 이름이 되며, 작명규칙은 아래와 같다.

  • 숫자나 '_'를 제외한 특수문자로 시작할 수 없다.
  • 공백이 이름에 포함될 수 없으며, 둘째 문자 부터 숫자와 '_', '-', '.', ':' 등의 특수문자 사용이 가능하다.

속성타입 작성

속성타입(Attribute Type)이란 속성이 가질 수 있는 데이터의 형태를 뜻하며, 그 종류는 아래와 같다.

  • CDATA : 단순한 문자데이터를 받을 경우 사용하는 유형이다.
        <!ATTLIST 엘리먼트명 속성명 CDATA 디폴트정의>
  • ID : 엘리먼트를 유일하게 구별할 수 있는 식별자를 지정하기 위해서 사용된다. ID를 속성타입으로 사용하게 되면 그 속성의 값은 그 XML문서의 ID값들 중에서 유일한 값만이 올 수 있다. 이 ID라는 속성의 DB에서 기본값과 같은 역할을 한다고 볼 수 있다. 이 ID 속성타입의 사용에는 약간의 제약사항이 존재한다.
    - ID속성은 하나의 엘리먼트에 하나만 존재할 수 있다.
    - ID속성의 값으로 공백이 포함될 수 없다.
    - ID속성의 값은 숫자로 시작할 수 없다.
        <!ATTLIST 엘리먼트명 속성명 ID 디폴트정의>
  • IDREF 또는 IDREFS : 해당 xml파일에서 ID 속성의 값만을 속성 값으로 받을 수 있는 속성타입이다. DB에서 외래키와 같다고 볼 수 있다. 
    - 이 속성타입은 이미 정의된 다른 ID값을 받기 때문에, ID와 제약사항이 같을 수 밖에없다.(즉 ID속성유형과 같이 속성값으로 공백이 포함될 수 없고, 숫자로 시작할 수 없다)0
    -  IDREF와 IDREFS의 차이점은 IDREF는 하나의 값만이 지정될 수 있지만, IDREFS는 여러 값들이 지정될 수 있다. 즉, IDREFS는 여러 ID값을 받을 수 있는데, 구분은 공백으로 한다.
        <!ELEMENT person EMPTY>
        <!ATTLIST person
            name ID #REQUIRED
            bestfriend IDREF #IMPLIED
            friends IDREFS #IMPLIED>
    위와 같이 DTD문서에 정의되어 있을 경우, person 엘리먼트의 속성은 다음과 같이 될 수 있다.
        <!-- IDREF와 IDREF값으로는 ID로 지정된 값만을 취할 수 있다. -->
        <person name="송준수" bestfriend="송준수">
        <person name="김수미" />
        <person name="고아라" bestfriend="송은영" />
        <person name="백승환" friends="고아라" />
        <!-- IDREFS는 여러 ID값이 지정될 수 있다.-->
        <person name="송은영" bestfriend="고아라" friends="백승환 고아라 김수미 송준수 송은영" />
  • NMTOKEN 또는 NMTOKENS : 작명규칙을 따르는 문자데이터형을 속성값으로 받을 수 있도록 한다. 작명규칙은 속성작명규칙과 같다. NMTOKENS는 공백으로 구분된 여러 값들을 받을 수 있도록 해준다.
  • 열거형(ENUMERATION) : 지정한 여러 속성값 중 하나를 선택할 수 있도록 하는 것이다.
        <!ATTLIST 속성명 (속성값1 | 속성값2 | 속성값n) 디폴트정의>
        <!ATTLIST occupation (student | professor | officer) #IMPLIED>
  • ENTITY 또는 ENTITIES : ENTITY값을 속성값으로 받을 수 있다. 하지만, 모든 엔티티값을 받을 수 있는 것은 아니다. 외부 일반 언파스드 엔티티, 즉 외부 파일로서 해석되지 않는 자료를 엔티티로 선언 했을 경우, 이 ENTITY로 지정한 속성의 값으로 받을 수 있다. ENTITIES는 ENTITY와 같지만 여러 값을 받을 수 있으며, 각 값들은 공백으로 구분된다.
        -DTD문서
        <?xml version="1.0"?>
        <!-- ENTITY에서 지정될 이미지에 대한 노테이션을 선언한다. -->
        <!NOTATION gif SYSTEM "painter.exe">
        <!-- 속성으로 사용될 외부 일반 언파스드 엔티티 선언 -->
        <!ENTITY SonPic SYSTEM "son.gif" NDATA gif>
        <!ENTITY KimPic SYSTEM "kim.gif" NDATA gif>
        <!--엘리먼트 선언-->
        <!ELEMENT people (person)*>
        <!ELEMENT person EMPTY>
        <!-- 속성 선언, ENTITY의 속성 타입을 사용했다.-->
        <!ATTLIST person
                name CDATA #REQURIED
                img ENTITY #REQUIRED>
        -XML문서
        <?xml version="1.0"?>
        <people>
            <!-- ENTITY타입의 속성인 img에 ENTITY값을 할당 -->
            <person name="손담비" img="SonPic" />
            <person name="김수로" img="KimPic" />
        </people>
  • NOTATION : Notation을 속성 값으로 받도록 할 수 있다.
    <!ATTLIST 대상엘리먼트명 속성명 NOTATION (노테이션명1 | 노테이션명2 | 노테이션명n) 디폴트정의>
    <!ELEMENT person EMPTY>
    <!ATTLIST person
           img CDATA #IMPLIED
          type NOTATION (gif | jpg) #IMPLIED>
    <!-- 위 DTD에 대한 xml파일 내용-->
    <person img="mypic.gif" type="gif" />

디폴트정의

속성의 Default값을 지정해주거나, 속성값을 생략하거나 반드시 기술하도록 정의하는 부분이다. 여기서 사용할 수 있는 값들은 다음과 같다.

  • Default 값 지정 : 속성 값 생략 시 기본적으로 지정될 데이터를 지정하면 됩니다. #IMPLIED, #FIXED와 같이 속성값을 생략할 수 있는 형태이다.
    <!ATTLIST 대상엘리먼트명 속성명 속성타입 "기본적으로 지정될 속성 값">
    <!ATTLIST person name EMPTY "Unknown">

    <!-- 생략 시 name속성의 값은 'Unknown'이 된다. -->
    <person></person>
  • #IMPLIED : 말 그대로, 속성을 생략할 수 있게 된다. <!ATTLIST 대상엘리먼트명 속성명 속성타입 #IMPLIED>
    <!ATTLIST person name EMPTY #IMPLIED>

    <!-- 생략 시 name 속성 값은 공란이 된다. -->
    <person></person>
  • #FIXED : 해당 속성값으로 고정값을 주고 싶을 때 사용합니다. 지정된 값 이외의 어떠한 값도 지정이 불가능하며, 그렇기 때문에 XML문서에서 속성값 작성을 생략할 수 도 있다.
    <!ATTLIST 대상엘리먼트명 속성명 속성타입 #FIXED "고정값지정">
    <!ATTLIST person occupation EMPTY #FIXED "Professor">

    <!-- 고정값 이외의 데이터는 기술 할 수 없다. -->
    <person occupation="Professor" />
    <!-- 생략 시 name 속성 값은 'Professor'가 된다. -->
    <person></person>
  • #REQUIRED : 속성값이 반드시 기술 되어야 하는 형태. 속성값을 생략할 수 없게 된다.

노테이션(NOTATION)

Notation이란 XML파서나 해석할 수 없는 데이터형으로, 해당 XML문서를 처리하는 애플리케이션이나 파서에게 특정 해석할 수 없는 비문자 데이터를 어떻게 처리하라는 지시자로 생각하면 된다. 비문자 데이터란, 그림, 동영상, 음악 등의 형태의 자료로서 이들 자료에 대해 xml에 기술할 때, 해당 자료를 해석할 수 있는 프로그램 명도 같이 지정해주는 것이 Notation의 역할이다. 사용방법은 매우 간단한데 아래와 같다.

<!NOTATION 노테이션명 PUBLIC "PUBLIC식별자" SYSTEM "데이터를 처리할 응용프로그램 경로">

위에서 PUBLIC "PUBLIC 식별자"는 생략이 가능하다. 다음은 PUBLIC식별자의 예이다.

<!NOTATION gif PUBLIC "-//CompuServe//NOTATION Graphics Interchange Format 89a//EN" SYSTEM "painter.exe">

간단하게 다음과 같은 표현이 주로 사용된다.

<!NOTATION gif SYSTEM "painter.exe">

NOTATION이 사용되는 곳으로는 속성으로 기술되거나 외부언파스드엔티티를 위해 사용된다.

신고
Tag : DTD, XML

name    password    homepage
 hidden


DTD문서 작성법 1 (엘리먼트가 가지는 데이터 유형 정의)

A사와 B사에서 정보전달을 위한 목적으로 XML을 사용하기로 했다. 하지만 어떻게 A사와 B사 모두 같은 문법을 사용한 XML문서를 작성하도록 할 수 있을까? 그것은 문법과 유형을 정의하고있는 DTD 문서를 작성하여, 두 회사에서 해당 DTD문서를 사용해 XML문서를 작성하게 하면 된다. 특정 DTD문서에서 정의한 문법에 어긋난 XML문서는 XML Parser가 해석할 때 에러를 출력하도록 할 수 있다..

텍스트 선언

xml문서와 마찬가지로 DTD문서의 최상단에는 텍스트 선언이라고 해서 다음과 같은 문장이 위치해야한다.(생략할 수 있다.)

<?xml version="버전" encoding="인코딩방식"?>
<?xml version="1.0" encoding="euc-kr"?>

생략시 Default 값은 '1.0', 'utf-8' 이다.

주석

<!-- -->로서 xml과 동일하다.

엘리먼트

xml 문서에서 사용할 엘리먼트를 선언하기 위해서는 <!ELEMENT>를 사용한다. xml은 대소문자를 구분하기 때문에, 'ELEMENT'는 반드시 대문자로 기술하여아한다.

<!ELEMENT 엘리먼트명 유형>

엘리먼트명의 작성 규칙은 다음과 같다.

  • 'xml', 숫자, 특수문자('_'문자는 제외)로 시작할 수 없다.
  • 두번째 문자 부터 '_', '.', '-' 문자와 숫자를 사용할 수 있다.(':' 문자도 사용할 수 있지만, 네임스페이스 선언과 중복되므로 사용을 권장하지 않는다.)
  • 공백이 포함될 수 없다.

유형에 사용될 수 있는 것들은 다음과 같다.

  • #PCDATA : 문자 데이터만을 가짐.
    '<!ELEMENT person (#PCDATA)>'는 xml문서에서 다음을 허용한다.
    <!-- CDATA섹션을 데이터로 가지는 엘리먼트-->
    <person><![CDATA[hellow]]></person>
      
  • EMPTY : 데이터를 가지지 않음.
    <!ELEMENT person EMPTY>
    이 유형을 가진 엘리먼트는 xml문서에서 다음과 같은 사용만 허용한다.
    <person></person> 또는 <person />
      
  • ANY : 모든 엘리먼트와 문자데이터를 가질 수 있음.
    '<!ELEMENT person ANY>'는 모든 엘리먼트와 데이터의 사용을 허용하게 된다.
      
  • 자식 엘리먼트 : 지정한 자식엘리먼트만 가질 수 있음.
    기술한 자식엘리먼트를 가질 수 있게 한다. 자식엘리먼트 리스트의 기술에는 패턴규칙이 적용될 수 있다. 즉, '?', '*'. '+'. '|', ','  등의 패턴과 결합해 다양한 표현을 할 수 가 있다.
    1. 반드시 기술한 순서대로 자식엘리먼트가 작성되도록 하는 ',' 연산자
        -DTD문서 내용
        <!ELEMENT person (name, gender)>
            <!ELEMENT name (#PCDATA)>
            <!ELEMENT gender (#PCDATA)>
        -XML문서내용
        <person>
             <name>이하늬</name>
             <gender>Female</gender>
        </person>
    2. 자식 엘리먼트의 반복 숫자를 제어할 수 있도록 해주는 '?', '*', '+' 연산자
      - ? : Zero or One
      - * : Zero or More
      - + : One or More
      의 의미를 가지고 있다. 따라서 다음과 같이 다양하게 표현할 수 있다.
        -DTD문서 내용
        <!ELEMENT person (name, age?, nickname+, (schoolname, graduated)*)>
            <!ELEMENT name (#PCDATA)>
            <!ELEMENT age (#PCDATA)>
            <!ELEMENT nickname (#PCDATA)>
            <!ELEMENT schoolname (#PCDATA)>
            <!ELEMENT graduated (#PCDATA)>
        -XML문서내용
        <person>
            <name>이시향</name>
            <age>16</age>
            <nickname>너구리</nickname>
            <nickname>이썅</nickname>
        </person>
    3. 리스트 중 하나만 선택해서 작성할 수 있도록 해주는 '|' 연산자
        -DTD문서 내용
        <!ELEMENT person (name, (brother|sister)*)>
            <!ELEMENT name (#PCDATA)>
            <!ELEMENT brother (#PCDATA)>
            <!ELEMENT sister (#PCDATA)>
        -XML문서내용
       
    <person>
            <name>정순영</name>
            <sister>정순화</sister>
            <brother>정순철</brother>
            <sister>정순지</sister>
        </person>
        
  • 혼합형태 : 아무 데이터나 자식을 가지지 않거나, 지정한 자식엘리먼트, 문자데이터 등 모두 가질 수 있는 형태
    <!ELEMENT person (#PCDATA | child1 | child2 | childN)*>
    위와 같이 사용할 수 있지만 다음과 같은 주의사항이 있다.
      - 문자데이터를 포함할 수 있도록 하기위해 #PCDATA는 반드시 젤 첫번째 위치에 존재해야한다.
      - 괄호 마지막에 '*'은 반드시 존재해야한다.
      - 리스트 사이에는 반드시 '|'연산자를 사용해야한다.
주의사항 : ANY나 EMPTY가 아닌 #PCDATA나 자식엘리먼트를 기술 할 때는 반드시 괄호'(', ')'에 포함되어야 한다.
신고
Tag : DTD, XML

name    password    homepage
 hidden


XML 기초 2

엘리먼트

  • XML문서의 엘리먼트영역을 구성하는 요소들을 Element라고 하며, 모든 XML문서는 반드시 단 하나의 루트 엘리먼트를 필요로 한다.
  • 엘리먼트는 자식엘리먼트를 가질 수 있고, 엘리먼트 스스로 부가적인 정보를 나타내기 위해 속성(attribute)를 가질 수 있다.
  • 엘리먼트는 시작태그와 끝태그로 구성이 되며, 시작과 끝태그 사이에 내용(Content)가 오게 된다. 문자열 또는 다른 엘리먼트가 자식으로서 사용될 수 있다.
  • 엘리먼트는 반드시 내용을 가지지 않아도 되며, 이를 빈 엘리먼트라고 한다. 시작태그와 끝태그 사이에 아무 내용을 넣지 않아도 되지만, <엘리먼트명 />로 간단하게 표현할 수 도 있다.
  • 태그 작명 규칙
    • 첫글자는 문자(숫자 제외)나 '_' 문자로만 시작할 수 있다.
    • 특수 문자로는 두번째 글자 부터 '_', '-', '.', ':' 등을 사용할 수 있다.
    • 공백은 허용되지 않는다.
    • 대소문자를 구분한다.
    • 태그명은 xml로 시작할 수 없다.

주석

XML은 주석으로서 하나의 문법만 제공한다.

<!-- 내용 -->

주의할 점은 주석의 내용 중에 '--' 가 있어서는 안된다는 점이다.

공백 문자열과 CDATA섹션

스페이스 #x20, 탭 #x9, 캐리지 리턴 #xd, 라인 피드 #xa 등은 공백문자로서 이들 문자들은 공백문자 하나로 취급된다. 즉 여러 번의 탭과, 공백이라도 결국은 한번 뛰어쓴 것 처럼 출력된다는 의미이다.

CDATA(Character Data)와 비교되는 것으로는 PCDATA(Parsed Character Data)가 있는데, PCDATA는 해석된 문자 데이터라는 의미 그대로 XML 해석기에 의해 문자열 내부에 해석가능한 데이터들이 모두 처리되어 출력되어진다. CDATA는 해석기를 통하지 않고 바로 출력되기 때문에, 기술한 그대로 출력된다. 예를 들어 PCDATA에서 여러번 중복된 공백문자열은 하나의 공백으로 대체되는데, CDATA로 출력하게 될 경우, 모든 공백과 태그, 엔티티 등의 참조 값들이 그대로 출력된다.

<!-- CDATA 작성하기 -->
<![CDATA[  내용  ]]>

내부DTD Subset와 외부 DTD Subset

XML에서 새로운 마크업 언어를 DTD를 이용하여 작성하게되는데, 이 DTD를 XML문서 내부 또는 별도의 파일로 둘 수 있게 된다. 보통 DTD는 별도의 파일로 작성되며 다수의 xml문서가 하나의 DTD를 참조하는 형태를 띠게된다.

다음은 외부 DTD의 예제이다. 보통 xml을 이용하여 마크업언어를 작성할 때는, 외부 DTD를 이용하게 된다.

<?xml version="1.0"?>
<!-- DTD 선언 -->
<!DOCTYPE booklist SYSTEM "booklist.dtd">
<!-- 루트엘리먼트 시작 -->
<booklist>
    <book>
        내용
    </book>
</booklist>

DOCTYPE라는 엘리먼트를 이용하여 DTD를 선언하게 되는데, DOCTYPE 사용 문법은 다음과 같다.

- PUBLIC DOCTYPE 식별자
<!DOCTYPE 최상위엘리먼트명 PUBLIC 
        "(비공인||공인 기관)//DTD 개발 기관 이름//DTD명 및 버전//사용된 언어"
        "DTD문서의 경로">

- SYSTEM DOCTYPE 식별자
<!DOCTYPE 최상위엘리먼트명 SYSTEM
        "DTD문서의 경로"
>

  • 'PUBLIC' 또는 'SYSTEM' 식별자의 차이점 : 공개되에 누구나 사용되는 DTD문서일 경우 PUBLIC를 사용하고, 내부적으로, 제한적으로 사용되는 DTD의 경우 SYSTEM 키워드를 사용하면된다.
    '최상위엘리먼트명'
    의 경우 굳이 최상위 명과 일치하지 않더라도 에러를 야기하지 않으나, 일치시키는 것이 권장된다.
  • '(비공인||공인 기관)'의 위치에는 DTD문서를 개발하고 관리하는 기관이 국제적으로 공인되었는지 아닌지에 따라, '+'혹은 '-'기호를 사용하면된다. 공인된 단체에서 작성된 DTD일 경우 '+', 비공인기관의 DTD일 경우 '-'이다.
  • '문서작성에 사용된 언어'의 경우 DTD문서가 작성된 언어의 국가 명을 기술하는 것으로서, 예를들어 영어로 작성된 경우 EN(대부분의 경우 해당)이 된다.
  • 'DTD주소'는 실제 DTD 문서의 경로가 위치하는 곳이다. PUBLIC DOCTYPE 식별자에서는 'DTD문서의 경로'가 생략될 수 도 있지만, 애플리케이션이나 브라우져에서 PUBLIC 식별자를 제대로 인식하지 못하는 경우를 대비하여 'DTD문서의 경로'를 기입할 수 도 있다.

실제로 DOCTYPE선언 예제는 다음과 같다.

<!DOCTYPE HTML PUBLIC
        "-//W3C//DTD HTML 4.01 Transitional//EN"
        "
http://www.w3.org/TR/html4/loose.dtd">

<!DOCTYPE booklist SYSTEM "booklist.dtd">

내부 DTD를 사용하는 경우는 대부분 몇몇 규칙을 새로이 또는 다시 정의 하기 위해서 사용된다. 재정의할 내용은 위에서 설명한 DOCTYPE엘리먼트에서 닫기태그 전에 대괄호('[', ']')안에다 재정의 내용을 기술 하면 된다. 다음은 내부 DTD의 예제이다.

<?xml version="1.0"?>
<!-- 내부 DTD 시작 -->
<!DOCTYPE booklist [
     <!--DTD내용 기술 (보통 재정의할 내용 기술)-->
    <!ELEMENT booklist (book)+>
    <!ELEMENT book (#PCDATA)>
]>

<!-- 내부 DTD 끝 -->

 

<?xml version="1.0"?>
<!-- 내부 DTD 시작 -->
<!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN"
      "http://www.wapforum.org/DTD/wml_1.1.xml" [
     <!--DTD내용 기술 (보통 재정의할 내용 기술)-->
     ......................
]>

<!-- 내부 DTD 끝 -->

신고
Tag : XML

name    password    homepage
 hidden


XML 기초 1

XML 이란?

  • 확장가능한 마크업 언어(Extensible markup Language)
  • Markup Language란, 문서의 내용에 추가적인 정보를 표시할 수 있는 언어를 뜻한다. 각 태그Markup이 되며, 태그에 포함된 내용들에 관한 추가적인 정보를 표현하는 역할을 한다.
  • Extensible에서 의미하는 바와 같이, XML은 필요에 따른 새로운 Markup Language를 생성할 수 있는 메타 언어이다. 메타 언어란, 다른언어를 기술하거나 분석하는데 쓰이는 언어라는 의미이다. 즉 XML을 이용해 문서를 작성한다라는 뜻은, XML로 제작된 언어로 문서를 작성한다는 의미로 보면 된다.
  • 메타언어에는 SGML(Standard Generated Markup Language)이 대표적이다. SGML로 만들어진 언어는 HTML이 있으며, XML은 SGML을 보다 단순하고 사용하기 쉽도록 한 언어로 보면된다. 즉 XML은 SGML의 부분집합이다.
  • XML은 데이터 전달을 목적으로 많이 사용되는데, 예를 들어 특정 언어에서 다른 언어, 다른 시스템으로 데이터를 전송하는데 있어서 가장 보편적으로 사용되고 있다. 즉 특정분야의 필요에 맞게 XML을 이용하여 언어를 만들고, 그 언어 규격에 맞게 XML을 이용해 서로 데이터를 전송하고 관리할 수 있게 된다. 특정 프로그램에서 다른 프로그램, 출판 분야, 고객 정보 관리, 데이터베이스 관리, 백업 등 데이터를 다루는 거의 모든 분야에서 사용가능하며 사용되어지고 있다.
  • XML이 HTML을 대체할 수 있다고 생각하는 사람이 있는데, XML과 HTML은 서로 다른 분야로서, XML이 HTML이 하는 역할을 할 수 없고, HTML이 XML의 기능을 대신할 수 없다.
  • Well- Formed XML Document : W3C의 XML 1.0권고안의 문법을 잘 지켜서 작성된 문서를 말한다. XML은 HTML과 달리 문법을 잘 지켜서 작성해야하며 그렇지 않을 경우, XML문서로 취급되지 않으며 작동하지 않는다.
  • Valid/Invalid Document : XML로 만들어진 특정 Markup Language에 맞게 작성된 문서이다. 'XML 문서에 대해 유효성 검사를 한다'라는 것은 XML로 개발된 특정 언어의 규칙과 구조에 맞는지 검증한다는 의미이다.

XML 문서 구조

  • Prolog : XML선언 및 문서 유형 선언(DTD::=Document Type Definition), 프로세싱 지시자(Processing Instruction)가 이 영역에 포함될 수 있다.
  • Element : 하나의 루트 엘리먼트와 하위 엘리먼트로 구성된다.
  • Misc : 문서 마지막에 위치하며 보통 생략되는 부분으로서 주석이나 Processing Instruction 등이 위치하는 경우가 많다.

XML 선언

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>

  1. 이 문장은 생략될 수 있지만, 기본적으로 xml문서에 기술되는 것이 권장된다.
  2. 반드시 문서 첫번째 라인에 위치해야하며, 주석도 이 문장 이전에 위치할 수 없다.
  3. '<?xml' 사이에 공백은 허용되지 않는다.
  4. encoding부분은 생략될 수 있으며, default는 UTF-8이다. 실제로 문서의 인코딩 타입과 일치하지 않을 경우 에러를 출력한다.
  5. standalone부분은 dtd부분이 xml문서에 포함되는건지, 외부 dtd를 참조하는건지에 따라 yes 또는 no를 설정하면 된다. 생략 가능한 부분으로 default값은 no로 작동된다. 이 부분을 생략하고 dtd부분을 xml문서에 포함 시켜도 아무 문제가 없으므로, 대부분의 경우 생략되는 부분이다.

기초문법

  • XML을 사용하기 위해 기본적으로 알야아하는 문법으로서 EBNF(Extended Backus-Naur Form)가 있다.

Symbol ::= Expression

  • CharA ::= [a-zA-Z0-9]은 CharA는 대소문자 a부터 z까지, 숫자 0부터 9까지 중 하나의 문자라는 의미이다.
  • 문자 표현은 ' 또는 " 문자 사이에 위치해야하며 대소문자를 구별한다.
  • 패턴 결합을 통해 보다 다양하고 복잡한 형태의 EBNF를 사용할 수 있다.
    • A : One, A표현은 한번만 기술되어야 한다.
    • A? : One or Zero, A표현은 기술되지 않거나 한번만 기술되어야 한다.
    • AB : A and B, A표현식과 B표현식은 순차적으로 기술되어야 한다.
    • A|B : A or B, A표현식과 B표현식 중 하나만 표현되어야 한다.
    • A-B : A without B, B표현식에 일치하지 않는 A표현식
    • A+ : One or More, A표현식은 1번 이상 기술 되어야 한다.
    • A* : Zero or More, A표현식은 기술되지 않거나 하나 이상 표현될 수 있다.

Version ::= 'version ' vnumber

vnumber ::= [a-zA-Z0-9.]+

  • 위의 표현식은 다음과 같다.
    Version = 'version 1.0z'
신고
Tag : ebnf, XML

name    password    homepage
 hidden


 Category
분류 전체보기 (95)
Netwrok & Security (6)
Web Development (61)
Database (5)
Framework (6)
Others (17)
About (0)
 TAGS
ajax WCF XML c#.net 영국 학원 특수문자 data tier class id 차이 exception MS SQL Server SourceSafe2005 ASP.NET RFC 4180 smarty linux php LiveMail 리눅스 Blog API 영국 인턴쉽 UpdateProgress 오라클 구조 ebnf ATRIX 오라클 DTD id name 차이 ASP maxRecievedMessageSize mantis bug tracker Silverlight application error #401 mantis 자바스크립트 It's me SourceSafe Internet 영국 홈스테이 web tier PHP 강좌 ie6 자바스크립트 버그
 Calendar
«   2017/10   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31        
 Visitor Statistics
Total : 248,436
Today : 10
Yesterday : 73
rss
 

티스토리 툴바