web

[XML] XML의 개념과 예시

소댓 2023. 5. 7. 18:21

* XML(eXtensible Markup Language)

: W3C 의 웹 표준 언어로 개발 : w3c.org

: HTML5 표준

: 데이터의 저장과 교환(JSON), 환경설정, UI 등에 많이 사용

 

<한글></한글> => 이렇게도 사용 가능!

 

 

* HTML의 단점

1. 사용할 수 있는 태그가 제한적

2. 정보 표현에만 기능이 집중

3. 구조화된 정보를 표현 / 검색, 문서 유효성 검증 X

 

 

* XML 구조

1. XML 선언부 >> 필수

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

2. 문서 구조(DTD: Document Type Definition) >> 생략 가능!

<!Doctype 루트엘리먼트명 SYSTEM 'dtd파일의 경로와 파일명'>

3. XML 태그 >> 필수

 

 

* <시작태그></종료태그>

1. 시작태그와 다음에는 반드시 종료 태그가 있어야 한다.

2. 모든 엘리먼트명은 대소문자를 구분한다.

<Person></person> XXXXXXXXXX

3. 엘리먼트와 텍스트 데이터를 함께 나타낼 수 있다.

<name>hong</name>

4. 엘리먼트 내용이 없으면 빈 요소를 둘 수 있다.

<age></age>

5. 태그를 겹쳐서 쓰는 것을 허용하지 않는다.

<name>

<age>

</age>

</name> 가능

 

<name></name>

<age></age> 가능

 

<name>

<age>

</name>

</age> 이렇게는 XXXXS

6. 최상위(ROOT) 엘리먼트는 1개만

------------------------------------------------------ XXXXXXXXXXX아래는 안됨

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

<!DOCTYPE person SYSTEM 'test01.dtd'>

<person>

<name>hong<</name>

<age>20</age>

</person>

<person>

<name>LEE<</name>

<age>20</age>

</person>

------------------------------------------------------ OOOOOOOOOOOOOOOOOOOOO가능

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

<!DOCTYPE person SYSTEM 'test01.dtd'>

<human>

<person>

<name>hong<</name>

<age>20</age>

</person>

<person>

<name>LEE<</name>

<age>20</age>

</person>

</human>

7. 엘리먼트명은 xml 이름 지정규칙을 따라야 한다.

 

 

* 이름 지정 규칙

1. 문자열은 'xml'로 시작할 수 없다.

2. 엘리먼트명은 반드시 문자, 혹은 _로 시작해야 한다.

3. 엘리먼트명은 중간에 공백을 사용할 수 없다.

<big small></big small> XXXXXX

단, 공백으로 끝날 수는 있다.

4. 예약어 사용할 수 없다.

 

 

 

++ 

1. Well-formed XML

(w3c 표준을 지킨 문서)

(한 단계 더 나아간 개념)

2. Valid XML : dtd, XSD(XML Shema Definition) 를 잘 만족하는 문서

Valid XML <== Well-formed XML + dtd, XSD 잘 만족하는 문서

 

 

 


- [xml01.xml] : new-other-xml

<?xml version="1.0" encoding="UTF-8"?>
<사람>	
	<이름>홍길동</이름>
	<나이>20</나이>
	<직업>도적</직업>
</사람>

 

 


- [xml02.xml] & [ex02.dtd]

<?xml version="1.0" encoding="UTF-8"?>
<!-- 어떤 엘리먼트가 사용될 수 있는지 정의할 수 있다. -->
<!-- Document Type Definition : DTD -->
<!DOCTYPE department SYSTEM "ex02.dtd" >

<!-- department>dept>deptno{10}+dname{ACCOUNTING}+loc{NEW YORK} 
공용: PUBLIC
사용자정의: SYSTEM
-->
<department>
	<dept>
		<deptno>10</deptno>
		<dname>ACCOUNTING</dname>
		<loc>NEW YORK</loc>
	</dept>
		<dept>
		<deptno>20</deptno>
		<dname>RESEARCH</dname>
		<loc>DALLAS</loc>
	</dept>
		<dept>
		<deptno>30</deptno>
		<dname>SALES</dname>
		<loc>CHICAGO</loc>
	</dept>
		<dept>
		<deptno>40</deptno>
		<dname>OPERATIONS</dname>
		<loc>BOSTON</loc>
	</dept>
</department>
<?xml version="1.0" encoding="UTF-8"?>

<!--  엘리먼트 (자식엘리먼트)기호
	+ : 1개 이상을 의미
	Parsed Character Data : PCDATA (값이 담긴 데이터)
 -->

<!ELEMENT department (dept)+ >
<!ELEMENT dept (deptno, dname, loc) >
<!ELEMENT deptno (#PCDATA) >
<!ELEMENT dname (#PCDATA) >
<!ELEMENT loc (#PCDATA) >

 


- [xml03.xml] & [ex03.dtd]

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE 사람들 SYSTEM "ex03.dtd" >

<!-- DTD : ex03.dtd -->
<사람들>
	<사람>
		<이름>홍길동</이름>
		<활동>
			동해 번쩍 서해 번쩍 도둑질
			
			아버지를 아버지라 부르지 않음
			
			&lt;&lt;&lt; 산적 두목 &gt;&gt;&gt; 
			
			율도국: 이적단체
		</활동>
		<나이	>20</나이>
	</사람>
	<사람>
		<이름>이순신</이름>
		<활동>
			장군
			<![CDATA[
				<특이사항>
				여기는 그냥 막 써도 돼요
				<<<장군>>>
			]]>
		</활동>
		<나이>21</나이>
	</사람>
</사람들>
<?xml version="1.0" encoding="UTF-8"?>

<!ELEMENT 사람들 (사람)+ >
<!ELEMENT 사람 (이름, 활동, 나이) >
<!ELEMENT 이름 (#PCDATA) >
<!ELEMENT 활동 (#PCDATA) >
<!ELEMENT 나이 (#PCDATA) >

 


- [xml04.xml] : dtd까지 한번에

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE 자동차 [
	<!ELEMENT 자동차  (기본, 모델, 옵션) >
	<!ELEMENT 기본 (회사명, 차종, 가격) >
	<!ELEMENT 모델 (색상, 배기량) >
	<!ELEMENT 옵션 (CD, 에어백) >
	<!ELEMENT 회사명 (#PCDATA) >
	<!ELEMENT 차종 (#PCDATA) >
	<!ELEMENT 가격 (#PCDATA) >
	<!ELEMENT 색상 (#PCDATA) >
	<!ELEMENT 배기량 (#PCDATA) >
	<!ELEMENT CD (#PCDATA) >
	<!ELEMENT 에어백 (#PCDATA) >
] >
<자동차>
	<기본>
		<회사명>꼬마자동차</회사명>
		<차종>붕붕카</차종>
		<가격>500</가격>
	</기본>
	<모델>
		<색상>노랑색</색상>
		<배기량>1000CC</배기량>
	</모델>
	<옵션>
		<CD>NO</CD>
		<에어백>NO</에어백>
	</옵션>
</자동차>

 

 


- [xml05.xml]

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE phone [
	<!ELEMENT phone (handphone)+ >
	<!ELEMENT handphone (os, name*, price) >
	<!ELEMENT os (#PCDATA) >
	<!ELEMENT name (#PCDATA) >
	<!ELEMENT price (#PCDATA) >
] >
<!-- 
	기호 : 사용횟수
	
	+ : 1개 이상
	* : 0개 이상 (없을 수도..)
	? : 0 OR 1
	
	A | B : A 또는 B 둘 중에 하나만 가능
	() : 요소를 그룹으로 선언해서 사용
	
 -->

<phone>
	<handphone>
		<os>안드로이드</os>
		<name>갤럭시</name>
		<price>150</price>
	</handphone>
	<handphone>
		<os>IOS</os>
		<name>아이폰</name>
		<price>150</price>
	</handphone>
</phone>

 


- [xml06.xml]

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE 학생들 [
	<!ELEMENT 학생들 (학생)+ >
	<!ELEMENT 학생 (학번, 이름, 나이*, 주소, 전화번호?) >
	<!ELEMENT 학번 (#PCDATA) >
	<!ELEMENT 이름 (#PCDATA) >
	<!ELEMENT 나이 (#PCDATA) >
	<!ELEMENT 주소 (#PCDATA) >
	<!ELEMENT 전화번호 (#PCDATA) >
	
	<!-- 속성 -->
	<!ATTLIST 학생 학년 (1|2|3|4|5|6) "1" >
	<!ATTLIST 학번 학과 (컴공|전산|고고학|건축) "컴공" >
] >

<학생들>
	<학생 학년="1">
		<학번 학과="전산">23</학번>
		<이름>나스물</이름>
		<나이>20</나이>
		<주소>서울</주소>
		<전화번호>02-1111-2222</전화번호>
	</학생>
	<학생 학년="3">
		<학번 학과="건축">20</학번>
		<이름>나하나</이름>
		<주소>부산</주소>
	</학생>
	<학생 학년="3">
		<학번 학과="고고학">19</학번>
		<이름>나파라오</이름>
		<나이>19</나이>
		<나이>20</나이>
		<나이>21</나이>
		<주소>이집트</주소>
		<전화번호>20-3333-4444</전화번호>	
	</학생>
</학생들>

 


- [quiz01.xml] : 시,도,동,구..

<?xml version="1.0" encoding="UTF-8"?>
<!-- 
	루트 엘리먼트는 사원이며 사원안에는 명함이라는 엘리먼트를
	두어야 한다. 명함은 중복이 가능하지만 반드시 1개 존재 
	명함에는 회사명과 부서, 성명, 주소, 전화, 팩스 하위
	엘리먼트들을 순서적으로 가진다. 
	
	전화는 중복 가능하지만 생략해서는 안되며, 팩스는 생략이 가능
	하지만 중복을 허용하지 않는다. 
	
	성명에는 사번이라는 속성을 정의하고 속성값은 파싱을 하지 않는
	문자데이터가 들어오며, 반드시 속성을 정의해야 한다.
	
	주소 하위 엘리먼트 '시' 와 '구' 아니면 '도'와 '시' 가 
	정의 된 후 '동' 이 순서적으로 정의 되어야 한다. 
-->
<!DOCTYPE 사원 [
	<!ELEMENT 사원 (명함)+ >
	<!ELEMENT 명함 (회사명, 부서, 성명, 주소, 전화+, 팩스?) >
	<!ELEMENT 회사명 (#PCDATA) >
	<!ELEMENT 부서 (#PCDATA) >
	<!ELEMENT 성명 (#PCDATA) >
	<!ELEMENT 전화 (#PCDATA) >
	<!ELEMENT 팩스 (#PCDATA) >
	<!ELEMENT 주소 (((시,구)|(도,시)),동) >
	<!ELEMENT 시 (#PCDATA) >
	<!ELEMENT 구 (#PCDATA) >
	<!ELEMENT 동 (#PCDATA) >
	<!ELEMENT 도 (#PCDATA) >
	
	<!ATTLIST 성명 사번 CDATA #REQUIRED >
]>


<사원>
	<명함>
		<회사명>중앙회사</회사명>
		<부서>영업</부서>
		<성명 사번="1111">김중앙</성명>
		<주소>
			<시>서울특별시</시>
			<구>성동구</구>
			<동>행당동</동>
		</주소>
		<전화>111-1111-1111</전화>
		<팩스>2222-2222-2222</팩스>
	</명함>
	<명함>
		<회사명>JHTA회사</회사명>
		<부서>인사</부서>
		<성명 사번="2222">김TA</성명>
		<주소>
			<도>서울도</도>
			<시>중구</시>
			<동>익선동</동>
		</주소>
		<전화>333-3333-3333</전화>
	</명함>
</사원>