Notice
Recent Posts
Recent Comments
Link
«   2025/06   »
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
Archives
Today
Total
관리 메뉴

Everything has an expiration date

[XMLStudy] 20240131 [프로그램 소스] 본문

[XML]

[XMLStudy] 20240131 [프로그램 소스]

Jelly-fish 2024. 1. 31. 14:09

XMLStudy

 

XMLApp01


체크할 사항

 

Ⅰ. XML 파일 형식

  • 루트 엘리먼트의 이름은 `『~~~.xml』` 파일 이름과 동일한 이름 사용
  • 복수(다수)의 데이터를 표현하는 경우 중간에 적절한 부모 태그 지정
  • 엘리먼트 하위에는 엘리먼트(또는 데이터)만 구성
  • 특수문자가 포함된 데이터인 경우 `『CDATA 섹션』`으로 처리
  • <!-- CDATA 섹션 -->
    <telephone><![CDATA[010-1234-4567]]></telephone>
  • 시작 태그끝 태그의 이름이 대소문자까지 완벽하게 일치
  • 모든 태그의 열고 닫는 순서가 정확하게 처리
  • 속성의 속성값이 `『""』`로 구성

 

[ ※ 용어 참고사항 ※ ]

* 『PCDATA』 : 여는 태그와 닫는 태그 사이를 PC 데이터(파싱 데이터) 라고 한다.
* 『CDATA 섹션』 : Parsed Data 를 하지 말고, 문자 그대로 표현하도록 처리를 요청하는 것.

 


Ⅱ. XML DTD 구성하기

<!DOCTYPE memberList
[
<!ELEMENT memberList (memberInfo+)>
<!ELEMENT memberInfo (name, telephone, curriculumn?, zipCode, addr)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT telephone (#PCDATA)>
<!ELEMENT curriculumn (sub+)>
<!ELEMENT sub (#PCDATA)>
<!ELEMENT zipCode (#PCDATA)>
<!ELEMENT addr (#PCDATA)>
<!ATTLIST memberInfo mid CDATA #REQUIRED>
]>

 

<!DOCTYPE 루트엘리먼트 []> 하단 구성

 

!ELEMENT [엘리먼트명] (구성요소) 엘리먼트에 대한 구성요소를 나열한다.
구성요소는 ⓐ하위 엘리먼트명이 올 수도 있고, ②PCDATA가 올 수도 있다.

ex) `<!ELEMENT memberList (memberInfo+)>`
!ATTLIST [엘리먼트명] [속성명] (속성 타입, 필수여부) 엘리먼트의 속성에 대한 타입 및 필수 여부 작성

ex) `<!ATTLIST memberInfo mid CDATA #REQUIRED>`
PCDATA 시작 태그와 끝 태그 사이의 일반적인 값`"동자"`을 의미한다.

ex) `<name>동자</name>`
CDATA 엘리먼트의 속성 값에 들어가는 일반적인 값 `"1"`을 의미한다.

ex) `<memberInfo sid="1">`
#REQUIRED 해당 속성이 엘리먼트에서 필수적인 속성임을 의미한다.
#IMPLIED 해당 속성이 엘리먼트에서 필수적인 속성이 아님을 의미한다.
[엘리먼트명]? (curriculumn?) 엘리먼트가 필수적으로 존재하지 않아도 됨을 의미한다.
`?` 표시가 없을 경우, 반드시 모든 루트 엘리먼트 하위에 해당 엘리먼트가 존재하여야 한다.

ex-1) `<!ELEMENT memberInfo (name, curriculumn?)>`
curriculumn 엘리먼트가 memberInfo 하위 엘리먼트로 존재하지 않을 수 있다.

ex-2) `<!ELEMENT memberInfo (name, curriculumn)>`
curriculumn 엘리먼트가 memberInfo 하위 엘리먼트로 반드시 존재하여야만 한다.
[엘리먼트명]+ (sub+) 해당 엘리먼트가 단일 개수가 아닌, 복수(다수)로 존재함을 의미한다.
ex) `<!ELEMENT curriculumn (sub+)>`

 


 

Ⅲ. Xml DOM 형성을 이용한 데이터 획득 후 결과 처리

 

1. XML 파일을 메모리에 로드시킬 준비를 한다.
   (XML DOM 형성을 위한 준비)

 

DocumentBuilderFactory 구성
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();​

 

DocumentBuilder 구성
DocumentBuilder builder = factory.newDocumentBuilder();​

 

Document 선언
Document xmlObj = null;​

 

2. XML 파일(로케이션에 저장된 상태)을 메모리에 로드한다 → XML DOM 형성

 

① XML 파일의 로케이션 경로를 문자열로 구성
    (현재, 프로젝트 하위에 바로 XML 파일을 저장해둔 상태.)
String url = "VEHICLES.xml";​

 

 

② `builder.parse(url)`을 이용하여 Document를 반환받는다.
xmlObj = builder.parse(url);​

 

루트 엘리먼트에 접근한다 
    XML 의 특성상, 루트 엘리먼트는 XML 파일을 대표하는 엘리먼트이다.
Element root = xmlObj.getDocumentElement();​

 

 

④ 루트 엘리먼트를 기반으로 하위 엘리먼트에 접근한다.
특정 하위 엘리먼트 접근 → 위치, 이름 등을 기준으로 접근한다.
NodeList vehicleNodeList = root.getElementsByTagName("VEHICLE");​

Ⅳ. XML DOM 메소드 Check~!!!

메소드 반환형 기능
root.getElementsByTagName() `NodeList` 태그의 이름을 가지고
하위(자식, 자손) 노드에
접근할 수 있도록 해주는
메소드이다.
DocumentBuilderFactory.newInstance() `DocumentBuilderFactory` DocumentBuilderFactory의 인스턴스를 생성하여 반환한다.

DocumentBuilderFactory는 추상 클래스이므로 이 메소드를 통해 인스턴스를 반환받는 것.
factory.newDocumentBuilder() `DocumentBuilder` DocumentBuilder의 인스턴스를 반환한다.

DocumentBuilder 또한 추상 클래스이므로, DocumentBuilderFactory의 이 메소드를 통해 인스턴스를 반환받는다.
builder.parse(String url) `Document` 매개변수 url에 해당하는 문서의 Document 객체를 반환한다.
xmlObj.getDocumentElement() `Element` XML 파일을 대표하는 루트 엘리먼트를 찾아 반환한다.

 


 

XMLApp01


WebContent

XmlTest01.xml
<?xml version="1.0" encoding="UTF-8"?>
<xmlTest01>
	<!-- 선언부와 루트만 존재하는 XML 문서 작성 -->
	<!-- 루트 엘리먼트(xmlTest01)도 사용자가 결정 -->
	<!-- XML 은 프로그램이 아니고, 데이터 표현 문서일 뿐이다. -->
	<!-- 데이터를 표현하는 하위 엘리먼트 추가 - 마크업 언어 기본 형식 -->
	
	<!-- [별도 필기]=======================================================-->
	<!-- 1차 조건 만족 : well-formed XML -->
	<!-- 2차 조건 만족 : valid XML -->
	<!-- XML 문서를 어느정도까지 규격화 시켰느냐를 따지는 기준이 존재한다. -->
	<!--===================================================================-->
</xmlTest01>

WebContent

MemberList.xml
<?xml version="1.0" encoding="UTF-8"?>
<memberList>
	<!-- 루트 엘리먼트는 하나 -->
	<!-- 루트 엘리먼트의 이름은 『~~~.xml』 파일 이름과 동일한 이름 사용 -->
	<!-- 복수(다수)의 데이터를 표현하는 경우 중간에 적절한 부모 태그 지정 -->
	<!-- 엘리먼트 하위에는 엘리먼트(또는 데이터)만 구성 -->
	<!-- 특수문자가 포함된 데이터인 경우 『CDATA 섹션』으로 처리 -->
	<!-- 시작 태그와 끝 태그의 이름이 대소문자까지 완벽하게 일치 -->
	<!-- 모든 태그의 열고 닫는 순서가 정확하게 처리 -->
	<!-- 속성의 속성값이 『""』로 구성 -->
	
	<!--***********************************************************************************-->
	<!-- PC Data : 여는 태그와 닫는 태그 사이를 PC 데이터(파싱 데이터) 라고 한다. -->
	<!-- CDATA 섹션 : Parsed Data 를 하지 말고, 문자 그대로 표현하도록 처리를 요청하는 것. -->
	<!--***********************************************************************************-->
	
	<!-- ※ 스스로(본인)의 정보를 표현할 수 있는 문서 작성 -->
	<!--    (+ 우리 팀원들) -->
	
	<memberInfo mid="1">
		<name>노은하</name>
		<telephone><![CDATA[010-1234-4567]]></telephone>
		<curriculumn>
			<sub>JAVA SE</sub>
			<sub>ORACLE</sub>
			<sub><![CDATA[Servlet&JSP]]></sub>
		</curriculumn>
		<zipCode>01234</zipCode>
		<addr>서울시 마포구 월드컵북로 150</addr>
	</memberInfo>
</memberList>

WebContent

MemList.xml
<?xml version="1.0" encoding="UTF-8"?>
<memList>
	<!-- memList.xml -->
	<memberInfo mid="1">
		<name>김지민</name>
		<telephone><![CDATA[010-3937-6913]]></telephone>
		<curriculumn>
			<sub>JAVA SE</sub>
			<sub>ORACLE</sub>
			<sub><![CDATA[Servlet&JSP]]></sub>
		</curriculumn>
	</memberInfo>
	<memberInfo mid="2">
		<name>강혜성</name>
		<telephone><![CDATA[010-6380-7047]]></telephone>
		<curriculumn>
			<sub>JAVA SE</sub>
			<sub>ORACLE</sub>
			<sub><![CDATA[Servlet&JSP]]></sub>
		</curriculumn>
	</memberInfo>
	<memberInfo mid="3">
		<name>이윤수</name>
		<telephone><![CDATA[010-4380-7265]]></telephone>
		<curriculumn>
			<sub>JAVA SE</sub>
			<sub>ORACLE</sub>
			<sub><![CDATA[Servlet&JSP]]></sub>
		</curriculumn>
	</memberInfo>
	<memberInfo mid="4">
		<name>정한울</name>
		<telephone><![CDATA[010-5218-6153]]></telephone>
		<curriculumn>
			<sub>JAVA SE</sub>
			<sub>ORACLE</sub>
			<sub><![CDATA[Servlet&JSP]]></sub>
		</curriculumn>
	</memberInfo>
	<memberInfo mid="5">
		<name>박범구</name>
		<telephone><![CDATA[010-2609-1830]]></telephone>
		<curriculumn>
			<sub>JAVA SE</sub>
			<sub>ORACLE</sub>
			<sub><![CDATA[Servlet&JSP]]></sub>
		</curriculumn>
	</memberInfo>	
	<memberInfo mid="6">
		<name>길현욱</name>
		<telephone><![CDATA[010-6678-9867]]></telephone>
		<curriculumn>
			<sub>JAVA SE</sub>
			<sub>ORACLE</sub>
			<sub><![CDATA[Servlet&JSP]]></sub>
		</curriculumn>
	</memberInfo>
	
	

</memList>

 

 


 

 

XmlApp02


WebContent

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

<!-- DTD 추가 -->
<!-- DTD 가 추가되면서 경고 표시가 사라졌다. -->
<!DOCTYPE memberList
[
<!ELEMENT memberList (memberInfo+)><!-- (memberInfo+) :  memberInfo가 하나가 아니므로! -->
<!ELEMENT memberInfo (name, telephone, curriculumn?, zipCode, addr)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT telephone (#PCDATA)>
<!ELEMENT curriculumn (sub+)><!-- (sub+) : sub가 하나가 아니므로!!!  -->
<!ELEMENT sub (#PCDATA)>
<!ELEMENT zipCode (#PCDATA)>
<!ELEMENT addr (#PCDATA)>
<!ATTLIST memberInfo mid CDATA #REQUIRED><!-- !ATTLIST  : 엘리먼트가 아니라 속성이므로! -->
]>

<!--
<!ATTLIST memberInfo mid CDATA #REQUIRED>
 
!ATTLIST  : 엘리먼트가 아니라 속성이므로!
CDATA     : 엘리먼트 값이 아닌, 속성 값이므로 
#REQUIRED : 필수적으로 존재해야 하는 속성.
#IMPLIED  : 필수적으로 존재하지 않아도 되는 속성.
-->

<!-- #REQUIRED : 이 속성은 반드시 명시되어야 한다. -->
<!-- #IMPLIED : 이 속성은 명시되기도 하고, 명시되지 않기도 한다. -->
<!-- #FIXED 특정값 : 이 속성은 특정값으로 고정되어 사용된다. -->
<!-- (curriculumn?) : curriculumn 속성이 있을 수도 있고 없을 수도 있는 경우.  
-->


<memberList>
	<memberInfo mid="1">
		<name>노은하</name>
		<telephone><![CDATA[010-1234-4567]]></telephone>
		<curriculumn>
			<sub>JAVA SE</sub>
			<sub>ORACLE</sub>
			<sub><![CDATA[Servlet&JSP]]></sub>
		</curriculumn>
		<zipCode>01234</zipCode>
		<addr>서울시 마포구 월드컵북로 150</addr>
	</memberInfo>
	<memberInfo mid="2">
		<name>김민지</name>
		<telephone><![CDATA[010-9987-8876]]></telephone>
		<zipCode>01285</zipCode>
		<addr>서울시 은평구 통일로 20</addr>
	</memberInfo>
</memberList>

 


WebContent

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

<!DOCTYPE memList 
[
<!ELEMENT memList (memberInfo+)>
<!ELEMENT memberInfo (name, telephone?, curriculumn, like?)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT telephone (#PCDATA)>
<!ELEMENT curriculumn (sub+)>
<!ELEMENT sub (#PCDATA)>
<!ELEMENT like (#PCDATA)>
<!ATTLIST memberInfo mid CDATA #REQUIRED>
]>

<memList>
	<!-- memList.xml -->
	<memberInfo mid="1">
		<name>김지민</name>
		<curriculumn>
			<sub>JAVA SE</sub>
			<sub>ORACLE</sub>
			<sub><![CDATA[Servlet&JSP]]></sub>
		</curriculumn>
	</memberInfo>
	<memberInfo mid="2">
		<name>강혜성</name>
		<telephone><![CDATA[010-6380-7047]]></telephone>
		<curriculumn>
			<sub>JAVA SE</sub>
			<sub>ORACLE</sub>
			<sub><![CDATA[Servlet&JSP]]></sub>
		</curriculumn>
		<like>pizza</like>
	</memberInfo>
	<memberInfo mid="3">
		<name>이윤수</name>
		<telephone><![CDATA[010-4380-7265]]></telephone>
		<curriculumn>
			<sub>JAVA SE</sub>
			<sub>ORACLE</sub>
			<sub><![CDATA[Servlet&JSP]]></sub>
		</curriculumn>
		<like>chicken</like>
	</memberInfo>
	<memberInfo mid="4">
		<name>정한울</name>
		<telephone><![CDATA[010-5218-6153]]></telephone>
		<curriculumn>
			<sub>JAVA SE</sub>
			<sub>ORACLE</sub>
			<sub><![CDATA[Servlet&JSP]]></sub>
		</curriculumn>
		<like>yoonsue</like>
	</memberInfo>
	<memberInfo mid="5">
		<name>박범구</name>
		<telephone><![CDATA[010-2609-1830]]></telephone>
		<curriculumn>
			<sub>JAVA SE</sub>
			<sub>ORACLE</sub>
			<sub><![CDATA[Servlet&JSP]]></sub>
		</curriculumn>
		<like>sleep</like>
	</memberInfo>	
	<memberInfo mid="6">
		<name>길현욱</name>
		<telephone><![CDATA[010-6678-9867]]></telephone>
		<curriculumn>
			<sub>JAVA SE</sub>
			<sub>ORACLE</sub>
			<sub><![CDATA[Servlet&JSP]]></sub>
		</curriculumn>
	</memberInfo>
</memList>

 


 

 

XmlApp03


 

실행 결과 스크린샷

XmlApp03.html [버튼 클릭시 koreanMajorCities의 이름과 행정구역이 테이블로 출력됨.]

 


WebContent

koreanMajorCities.xml
<?xml version="1.0" encoding="UTF-8"?>
<koreanMajorCities>
	<city>
		<name>서울</name>
		<class>특별시</class>
	</city>
	<city>
		<name>부산</name>
		<class>광역시</class>
	</city>
	<city>
		<name>인천</name>
		<class>광역시</class>
	</city>
	<city>
		<name>대전</name>
		<class>광역시</class>
	</city>
	<city>
		<name>광주</name>
		<class>광역시</class>
	</city>
	<city>
		<name>울산</name>
		<class>광역시</class>
	</city>
	<city>
		<name>수원</name>
		<class>시</class>
	</city>
	<city>
		<name>청주</name>
		<class>시</class>
	</city>
	<city>
		<name>목포</name>
		<class>시</class>
	</city>
</koreanMajorCities>

WebContent

XmlApp03.html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>XmlApp03.html</title>

<style type="text/css">
	table, th, td
	{
		border: 1px solid gray;
		border-collapse: collapse;
	}
	
</style>

<script type="text/javascript">

	function loadDoc()
	{
		// 확인
		//alert("함수 호출 확인~!!!!");
		
		var xmlHttp = new XMLHttpRequest();
		xmlHttp.onreadystatechange = function()
		{
			if (this.status==200 && this.readyState==4)
			{
				// 업무 처리
				displayData(xmlHttp);
			}
		};
		
		xmlHttp.open("GET", "koreanMajorCities.xml", "true");
		xmlHttp.send("");
	}
	
	// 업무 처리
	function displayData(xmlHttp)
	{
		var xmlObj, cityList, result, idx;
		xmlObj = xmlHttp.responseXML;			//-- 요청한 데이터를 XML DOM 객체로 반환.
		result = "<table><tr><th>도시 이름</th><th>행정구역</th></tr>";
		cityList = xmlObj.getElementsByTagName("city");
		for (idx=0; idx<cityList.length; idx++)
		{
			result += "<tr><td>"
				   + cityList[idx].getElementsByTagName("name")[0].childNodes[0].nodeValue
				   + "</td><td>"
				   + cityList[idx].getElementsByTagName("class")[0].childNodes[0].nodeValue
				   + "</td></tr>";
		}
		result += "</table>";
		
		document.getElementById("text").innerHTML = result;
	}
	
</script>

</head>
<body>

<div>
	<h1>HTML로 부터 데이터 분리(관찰)</h1>
	<hr>
</div>

<div>
	<button type="button" onclick="loadDoc()">XML 데이터 불러오기~!!!</button>
	<p id="text"></p>
</div>

</body>
</html>

 

XmlApp04


VEHICLES.xml
<?xml version="1.0" encoding="utf-8"?>
<VEHICLES>
	<LAST_INVENTORY_NUMBER>11</LAST_INVENTORY_NUMBER>
	<VEHICLE>
		<INVENTORY_NUMBER>1</INVENTORY_NUMBER>
		<MAKE>Dodge</MAKE>
		<MODEL>Durango</MODEL>
		<YEAR>1998</YEAR>
		<PICTURE>DodgeDurango.jpg</PICTURE>
		<STYLE>Sport Utility</STYLE>
		<DOORS>4</DOORS>
		<PRICE>18000</PRICE>
		<MILEAGE>32000</MILEAGE>
		<OPTIONS>
			<Power_Locks>Yes</Power_Locks>
			<Power_Window>Yes</Power_Window>
			<Stereo>Radio/Cassette/CD</Stereo>
			<Air_Conditioning>Yes</Air_Conditioning>
			<Automatic>Yes</Automatic>
			<Four_Wheel_Drive>Full/Partial</Four_Wheel_Drive>
			<Note>Very clean</Note>
		</OPTIONS>
		<OWNER>
			<NAME>Douglas Briggs </NAME>
			<EMAIL>DBriggs@aDomain.Com</EMAIL>
			<PHONE>781 781 7811</PHONE>
		</OWNER>
	</VEHICLE>
	<VEHICLE>
		<INVENTORY_NUMBER>2</INVENTORY_NUMBER>
		<MAKE>Honda</MAKE>
		<MODEL>Civic</MODEL>
		<YEAR>1997</YEAR>
		<PICTURE>HondaCivic.jpg</PICTURE>
		<PRICE_YEN>20000000</PRICE_YEN>
		<STYLE>Sedan</STYLE>
		<DOORS>4</DOORS>
		<PRICE>8000</PRICE>
		<MILEAGE>56000</MILEAGE>
		<OPTIONS>
			<Power_Locks>Yes</Power_Locks>
			<Power_Window>Yes</Power_Window>
			<Stereo>Radio/Cassette</Stereo>
			<Automatic>Yes</Automatic>
			<Note>Like New</Note>
		</OPTIONS>
		<OWNER>
			<NAME>Israel Hodgson </NAME>
			<EMAIL>IHodgson@aDomain.Com</EMAIL>
			<PHONE>781 781 782</PHONE>
		</OWNER>
	</VEHICLE>
	<VEHICLE>
		<INVENTORY_NUMBER>3</INVENTORY_NUMBER>
		<MAKE>Dodge</MAKE>
		<MODEL>Neon</MODEL>
		<YEAR>1996</YEAR>
		<PICTURE>DodgeNeon.jpg</PICTURE>
		<STYLE>Sedan</STYLE>
		<DOORS>4</DOORS>
		<PRICE>7000</PRICE>
		<MILEAGE>55000</MILEAGE>
		<OPTIONS>
			<Stereo>Radio/Cassette</Stereo>
			<Automatic>Yes</Automatic>
			<Note>Need minor body works</Note>
		</OPTIONS>
		<OWNER>
			<NAME>Arthur Shin </NAME>
			<EMAIL>IHodgson@aDomain.Com</EMAIL>
			<PHONE>781 781 782</PHONE>
		</OWNER>
	</VEHICLE>
	<VEHICLE>
		<INVENTORY_NUMBER>4</INVENTORY_NUMBER>
		<MAKE>Ferrari</MAKE>
		<MODEL>F355</MODEL>
		<YEAR>1995</YEAR>
		<PICTURE>FerrariF355.jpg</PICTURE>
		<STYLE>Sport</STYLE>
		<DOORS>2</DOORS>
		<PRICE>45000</PRICE>
		<MILEAGE>63000</MILEAGE>
		<OPTIONS>
			<Power_Locks>Yes</Power_Locks>
			<Power_Window>Yes</Power_Window>
			<Stereo>Radio/Cassette/CD</Stereo>
			<Air_Conditioning>Yes</Air_Conditioning>
			<Note>Luxury car</Note>
		</OPTIONS>
		<OWNER>
			<NAME>Jungchul Frye</NAME>
			<EMAIL>JFrye@aDomain.Com</EMAIL>
			<PHONE>781 781 782</PHONE>
		</OWNER>
	</VEHICLE>
	<VEHICLE>
		<INVENTORY_NUMBER>5</INVENTORY_NUMBER>
		<MAKE>BMW</MAKE>
		<MODEL>3 Series</MODEL>
		<YEAR>1998</YEAR>
		<PICTURE>BMWSeries3.jpg</PICTURE>
		<STYLE>Sedan</STYLE>
		<DOORS>4</DOORS>
		<PRICE>40000</PRICE>
		<MILEAGE>12000</MILEAGE>
		<OPTIONS>
			<Power_Locks>Yes</Power_Locks>
			<Power_Window>Yes</Power_Window>
			<Interiors>Leather</Interiors>
			<Stereo>Radio/Cassette/CD</Stereo>
			<Air_Conditioning>Yes</Air_Conditioning>
			<Note>Pre-owned</Note>
		</OPTIONS>
		<OWNER>
			<NAME>Bill Pease</NAME>
			<EMAIL>BPease@aDomain.Com</EMAIL>
			<PHONE>781 781 782</PHONE>
		</OWNER>
	</VEHICLE>
	<VEHICLE>
		<INVENTORY_NUMBER>6</INVENTORY_NUMBER>
		<MAKE>BMW</MAKE>
		<MODEL>Z3</MODEL>
		<YEAR>1998</YEAR>
		<PICTURE>BMWZ3.jpg</PICTURE>
		<STYLE>Convertible</STYLE>
		<DOORS>2</DOORS>
		<PRICE>33000</PRICE>
		<MILEAGE>24000</MILEAGE>
		<OPTIONS>
			<Cover_Material>Plastic</Cover_Material>
			<Power_Locks>Yes</Power_Locks>
			<Power_Window>Yes</Power_Window>
			<Alarm>Yes</Alarm>
			<Interiors>Fabric</Interiors>
			<Stereo>Radio/Cassette/CD</Stereo>
			<Air_Conditioning>Yes</Air_Conditioning>
			<Note>Pre-owned, very clean</Note>
		</OPTIONS>
		<OWNER>
			<NAME>Scott Tufo</NAME>
			<EMAIL>STufo@aDomain.Com</EMAIL>
			<PHONE>781 781 783</PHONE>
		</OWNER>
	</VEHICLE>
	<VEHICLE>
		<INVENTORY_NUMBER>7</INVENTORY_NUMBER>
		<MAKE>Dodge</MAKE>
		<MODEL>RAM</MODEL>
		<YEAR>1997</YEAR>
		<PICTURE>DodgeRAM1500.jpg</PICTURE>
		<STYLE>Truck</STYLE>
		<DOORS>2</DOORS>
		<PRICE>22000</PRICE>
		<MILEAGE>45000</MILEAGE>
		<OPTIONS>
			<Stereo>Radio</Stereo>
			<Max_Load>1500</Max_Load>
			<Note>Heavy duty Vehicle</Note>
		</OPTIONS>
		<OWNER>
			<NAME>Dealer</NAME>
		</OWNER>
	</VEHICLE>
	<VEHICLE>
		<INVENTORY_NUMBER>8</INVENTORY_NUMBER>
		<MAKE>Honda</MAKE>
		<MODEL>Accord</MODEL>
		<YEAR>1995</YEAR>
		<PICTURE>HondaAccord.jpg</PICTURE>
		<PRICE_YEN>25000000</PRICE_YEN>
		<STYLE>Sedan</STYLE>
		<DOORS>4</DOORS>
		<PRICE>8500</PRICE>
		<MILEAGE>145000</MILEAGE>
		<OPTIONS>
			<Power_Locks>Yes</Power_Locks>
			<Stereo>Radio/Cassette</Stereo>
			<Automatic>Yes</Automatic>
		</OPTIONS>
		<OWNER>
			<NAME>Bob Johnson</NAME>
			<PHONE>781 781 783</PHONE>
		</OWNER>
	</VEHICLE>
	<VEHICLE>
		<INVENTORY_NUMBER>9</INVENTORY_NUMBER>
		<MAKE>Dodge</MAKE>
		<MODEL>RAM 2500</MODEL>
		<YEAR>1996</YEAR>
		<PICTURE>DodgeRAM2500.jpg</PICTURE>
		<STYLE>Truck</STYLE>
		<DOORS>2</DOORS>
		<PRICE>25000</PRICE>
		<MILEAGE>23000</MILEAGE>
		<OPTIONS>
			<Stereo>Radio/Cassette</Stereo>
			<Max_Load>2500</Max_Load>
			<Note>Heavy duty truck</Note>
		</OPTIONS>
		<OWNER>
			<NAME>Pia Kinnear</NAME>
			<EMAIL>PKinnearo@aDomain.Com</EMAIL>
			<PHONE>781 781 784</PHONE>
		</OWNER>
	</VEHICLE>
	<VEHICLE>
		<INVENTORY_NUMBER>10</INVENTORY_NUMBER>
		<MAKE>Ford</MAKE>
		<MODEL>Explorer</MODEL>
		<YEAR>1996</YEAR>
		<PICTURE>FordExplorer.jpg</PICTURE>
		<STYLE>Sport Utility</STYLE>
		<DOORS>4</DOORS>
		<PRICE>18000</PRICE>
		<MILEAGE>105000</MILEAGE>
		<OPTIONS>
			<Power_Locks>Yes</Power_Locks>
			<Stereo>Radio/Cassette</Stereo>
			<Automatic>Yes</Automatic>
			<Interiors>Fabric</Interiors>
			<Air_Conditioning>Yes</Air_Conditioning>
			<Note>Pre-owned, very clean</Note>
		</OPTIONS>
		<OWNER>
			<NAME>Shawn Denoncour</NAME>
			<EMAIL>SDenoncour@aDomain.Com</EMAIL>
			<PHONE>781 781 785</PHONE>
		</OWNER>
	</VEHICLE>
</VEHICLES>

 


 

Java Resources > src > com.test

 

XmlDomTest01.java
/*=================================================
     XmlDomTest01.java
     - 콘솔 기반 자바 프로그램
     - XML DOM 활용 → 로컬(local) XML 읽어내기
===================================================*/


package com.test;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;

public class XmlDomTest01
{
	public static void main(String[] args)
	{
		// 1. XML 파일을 메모리에 로드 → XML DOM 형성
		// 2. 루트 엘리먼트 접근
		// 3. 특정 하위 엘리먼트 접근 → 위치, 이름 등을 기준으로 접근
		// 4. 텍스트 노드(속서 노드) 접근 → 데이터 획득
		// 5. 결과 처리(출력)
		
		try
		{
			// XML 파일을 메모리에 로드시킬 준비
			// → XML DOM 형성을 위한 준비
			//    (이름 위해 필요한 리소스 구성)
			DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
			// * DocumentBuilderFactory - 추상 클래스이므로, 스태틱 메소드를 통해 인스턴스 반환받는다.
			DocumentBuilder builder = factory.newDocumentBuilder();
			Document xmlObj = null;
			
			// XML 파일을 메모리에 로드 → XML DOM 형성
			String url = "VEHICLES.xml";
			xmlObj = builder.parse(url);
			
			// 루트 엘리먼트 접근
			Element root = xmlObj.getDocumentElement();
			// * XML 의 특성상, 루트 엘리먼트는 XML 파일을 대표하는 엘리먼트이다.
			
			// 테스트 
			//System.out.println(root.getNodeName());
			//--==>> VEHICLES
			//System.out.println(root.getNodeValue());
			//--==>> null
			//System.out.println(root.getNodeType());
			//--==>> 1
			
			// 루트 엘리먼트를 기반으로 하위 엘리먼트 접근하기.
			
			// 특정 하위 엘리먼트 접근 → 위치, 이름 등을 기준으로 접근
			// 『getElementsByTagName()』 메소드는 태그의 이름을 가지고
			//  하위(자식, 자손) 노드에 접근할 수 있도록 해 주는 메소드
			NodeList vehicleNodeList = root.getElementsByTagName("VEHICLE");
			
			
			
			
			
			
			
			
		} catch (Exception e)
		{
			System.out.println(e.toString());
		}
		
	}
}

'[XML]' 카테고리의 다른 글

★ [XmlStudy] 20240205 [프로그램 소스]  (3) 2024.02.05
[XmlStudy] 20240202 [프로그램 소스]  (2) 2024.02.02
[XmlStudy] 20240201 [프로그램 소스]  (1) 2024.02.01
[XML DTD] - Content  (0) 2024.01.31
[XML] - Content  (0) 2024.01.31