Everything has an expiration date
[XMLStudy] 20240131 [프로그램 소스] 본문
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
실행 결과 스크린샷
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 |