2013년 8월 14일 수요일

[오라클자바community, XML강좌]XML Entity

--------------
문자 Entity
-------------- 

오라클자바커뮤니티에서 설립한 오엔제이프로그래밍 실무교육센터
(신입사원채용무료교육, 오라클SQL, 튜닝, 힌트,자바프레임워크, 안드로이드, 아이폰, 닷넷)  
 
<?xml version="1.0" encoding="euc-kr"?>
<!DOCTYPE text [
<!ELEMENT text (#PCDATA)>
]>

<text>&copy; All Copyrights reserved</text>


-----------------------------------
General Entity(파싱되는 내부 엔터티)
-----------------------------------
<!ENTITY 이름 “대치문자”>의 형식이며 대치문자는 Well Formed XML컨텐츠여야 한다.

<?xml version="1.0" encoding="euc-kr"?>
<!DOCTYPE Book [
<!ELEMENT Book (Publisher)>
<!ELEMENT Publisher (CorpName, Copyright) >
<!ELEMENT CorpName (#PCDATA) >
<!ELEMENT Copyright (#PCDATA) >

<!-- 엔터티 선언부분 -->
<!ENTITY copy "&copy;"> 
<!ENTITY PubName "YoungJin Press Ltd.">
<!ENTITY CopyrightText "Copyright &copy; &PubName; All Rights...">
]>
<Book>
<Publisher>
<CorpName>&PubName;</CorpName>
<Copyright>&CopyrightText;</Copyright>
</Publisher>
</Book>

------------------------------------
General Entity(파싱되는 외부 엔터티)
------------------------------------
앞의 파싱되는 내부엔티티와 동일한 성격을 같지만 엔티티값이 외부에 존재한다.
<!ENTITY 엔터티이름 SYSTEM “위치” > 
SYSTEM 선언으로 “위치”에는 ‘system identifier’에 해당하는
 URI가 온다. URI는 시스템에 존재하는 파일이름이나 URL등을
 통해 표현 할수있다.
<!ENTITY 엔터티이름 PUBLIC “위치_1” “위치_2” >
PUBLIC선언으로 “위치_1”에는 ‘public identifier’에 해당하는
텍스트가 오며 “위치_2”에는 “위치_1”의 위치와 동일하게 
URI가 온다.




Copyright.dtd
&copy; All Copyrights reserved &PubName;


GeExEntity.xml
<?xml version="1.0" encoding="euc-kr" ?>
<!DOCTYPE Book [
<!ELEMENT Book (Publisher)>
<!ELEMENT Publisher (CorpName, Copyright) >
<!ELEMENT CorpName (#PCDATA) >
<!ELEMENT Copyright (#PCDATA) >

<!ENTITY copy "&copy;">
<!ENTITY PubName "영진출판사">
<!ENTITY Copyrights SYSTEM "copyright.dtd">
]>
<Book>
<Publisher>
<CorpName>&PubName;</CorpName>
<Copyright>&Copyrights;</Copyright>
</Publisher>
</Book>

외부파일을 참조할때 사용하는 SYSTEM및 PUBLIC의 차이점

SYSTEM
SYSTEM을 이용하여 URL을 지정하는 방법은 보통 하나의 조직(서버)
안에 DTD와 그 DTD와 관련이 있는 모든 문서들이 존재하는 경우에 매우 
유용하다.
한명의 저자나 그룹에 의해 사용되는 개별적인 DTD를 선언하기 위한것
 <!DOCTYPE greeting SYSTEM “http://www.a.com/greeting.dtd”>
 <!DOCTYPE greeting SYSTEM “file:///temp/greeting.dtd”>

PUBLIC
표준화기구나 개발조직 등에서 사용하기 위해 설계된 공개 DTD emddmf 
참조하는 경우에 사용한다.
PUBLIC 키워드다음에 오는 URI를 못찾는 경우를 대비하여 URL도 
보통 함께 명시한다.
<!DOCTYPE greeting PUBLIC “publishing/greeting.dtd” 
http://www.a.com/greeting.dtd”>



--------------------------------------
General Entity(파싱되지않는 외부 엔터티)
---------------------------------------
XML파서가 파싱하지 않는 파일포맷(binary)으로 되어 있지만 XML스펙상으로는 파싱불가능한 엔터티의 내용에 대한 어떠한 제한 조건도 없다. 따라서 binary뿐아니라 일반텍스트도 이러한 엔티티의 내용이 될수 있다.

선언형태 
<!ENTITY 엔티티이름 SYSTEM “위치” NDATA 노테이션타입>
<!ENTITY 엔티티이름 PUBLIC “위치1” “위치2” NDATA 노테이션타입>

NDATA는 XML파서가 해당 외부엔티티가 ‘파싱가능한지’ ‘파싱불가능한지’를 구분할수 있게 해준다. 즉 NDATA선언이 있으면 해당 파일의 내용을 일일이 파싱하지 않아도 된다.


 노테이션타입의 경우 DTD에 선언된 NOTATION의 이름이다. 다시말해 NDATA를 선언하기 위해서는 미리 NOTATION(노테이션)에 해당 노테이션타입이 선언되어 있어야 하며 ‘노테이션타입’은 선언된 NOTATION(노테이션)의 이름과 일치해야 한다.

 파싱되지않는 외부 엔터티에 NDATA와 노테이션이름을 추가해주는 목적은 예를들어 이미지파일이 문서에서 참조하는 외부엔티티에 해당 한다면 이 엔티티와 연관된 노테이션정보는 이 외부이미지 파일을 처리하기 위한 Application이나 Handler가 필요할수 있다. 이렇게 XML파서에게 처리할수 없는 타입이 엔티티의 내용으로 선언되었을때 처리해주는 Application을 지정해주기 위해 노테이션 정보가 필요하다.

<?xml version="1.0" encoding="euc-kr" ?>
<!DOCTYPE resume [
<!NOTATION GIF SYSTEM "viewer.exe">
<!ENTITY pic1 SYSTEM "blue.gif" NDATA GIF>
<!ENTITY pic2 SYSTEM "red.gif" NDATA GIF>

<!ELEMENT resume (candidate)*>
<!ELEMENT candidate (#PCDATA)>
<!ATTLIST candidate picture_file ENTITY #REQUIRED>
]>
<resume>
<candidate picture_file="pic1">
jclee
</candidate>
<candidate picture_file="pic2">
jhahn
</candidate>
</resume>

------------------
Parameter Entity
------------------
DTD에서만 사용되며 반드시 파실가능한 엔티티라고 할수있다.
 일반 엔티티와 달리 엔티티선언및 참조시 %를 사용한다.
 내부 파라미터 엔티티 
    내용이 DTD안에 있다.
    DTD에 자주 선언되는 텍스트를 효율적으로 관리하기 위한 목적으로
    쓰인다. 중복타이핑을 줄이며 가독성및 DTD수정에 도움을 준다.
    <!ENTITY % 엔티티이름 “엔티티값”>
 외부파라미터 엔티티
  내용이 DTD외부에 있다.
  DTD를 여러 개의 파일로 나눌때 사용
 
내부 파라미터 엔티티

* 내부 파라미터엔티티를 사용안한 경우
<!ELEMENT receiver (PCDATA)>
<!ELEMENT sender (PCDATA)>
<!ELEMENT hidden-reveiver (PCDATA)>

<!ATTLIST receiver title CDATA #IMPLIED>
<!ATTLIST sender  title CDATA #IMPLIED>
<!ATTLIST hidden-receiver  title CDATA #IMPLIED>



* 내부 파라미터엔티티를 사용한 경우
<!ELEMENT receiver (PCDATA)>
<!ELEMENT sender (PCDATA)>
<!ENTITY % a.title "title CDATA #IMPLIED”>

<!ATTLIST receiver %a.title>
<!ATTLIST sender  %a.title>
<!ATTLIST hidden-receiver  %a.title>


외부 파라미터 엔티티
<?xml version="1.0" encoding="euc-kr"?>
<!DOCTYPE 도서목록 [
<!ELEMENT 도서목록 (책)>
<!ENTITY % book SYSTEM "s1.dtd">
%book;
]>
<도서목록>
<책>
<도서명>C++</도서명>
<저자>jclee</저자>
<출판사>영진.com</출판사>
<가격>3000</가격>
</책>
</도서목록>

<!-- s1.dtd -->
<?xml version="1.0" encoding="euc-kr" ?>
<!ELEMENT 책 (도서명, 저자, 출판사, 가격) >
<!ELEMENT 도서명 (#PCDATA) >
<!ELEMENT 저자 (#PCDATA) >
<!ELEMENT 출판사 (#PCDATA) >
<!ELEMENT 가격 (#PCDATA) >

댓글 없음:

댓글 쓰기