반응형
*속성 Parsing
<?xml version="1.0" ...?>
<부모노드>
<자식노드 속성명="값">
...
</부모노드>
.xml |
자식노드 얻기
Element el=
속성얻기
Attribute att=el.getAttribute("속성명"); //color
속성의 값얻기
String<=att.getValue(); //#333 |
<<템플릿 만듦>>>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<link rel="stylesheet" type="text/css" href="http://localhost:8080/jsp_prj/common/main_v190130.css"/>
<style type="text/css">
#wrap{margin:0px auto;width:800px; height:860px;}
#header{width:800px; height:140px; background:#FFFFFF url(http://localhost:8080/jsp_prj/common/images/header_bg.png) repeat-x;
position: relative; }
#headerTitle{font-family: HY견고딕,고딕; font-size:35px; font-weight:bold; text-align:center;
/* padding-top: 35px */ position:absolute; top:40px; left:290px; }
#container{width:800px; min-height: 600px; }
#footer{width:800px; height:120px; }
#footerTitle{float: right; font-size:15px; padding-top:20px; padding-right:20px; }
</style>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.2.4/jquery.min.js"></script>
<script type="text/javascript">
$(function(){
});//ready
</script>
</head>
<body>
<div id="wrap">
<div id="header">
<div id="headerTitle">SIST Class4</div>
<div style="padding-top:100px; ">
<c:import url="../common/jsp/main_menu.jsp"></c:import>
</div>
</div>
<div id="container">
</div>
<div id="footer">
<div id="footerTitle">copyright© all right reserved. class 4.</div>
</div>
</div>
</body>
</html>
<<속성파싱 해봄>>
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<persons>
<person>
<name lastName="김">윤</name>
<address city="강남구" zipcode="12345">신동</address>
</person>
<person>
<name lastName="김">철</name>
<address city="관악구" zipcode="22345">신동</address>
</person>
<person>
<name lastName="노">경</name>
<address city="강서구" zipcode="49149">방동</address>
</person>
<person>
<name lastName="김">정</name>
<address city="관악구" zipcode="87211">청동</address>
</person>
<person>
<name lastName="정">성</name>
<address city="구로구" zipcode="99999">개동</address>
</person>
</persons>
package xml0327;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.jdom2.Attribute;
import org.jdom2.Document;
import org.jdom2.Element;
import org.jdom2.JDOMException;
import org.jdom2.input.SAXBuilder;
public class AttParsing {
public List<AttVO> personData(String lastName) throws MalformedURLException, JDOMException, IOException{
List<AttVO> list=new ArrayList<AttVO>();
//1.Builder 생성 =>(Parser)
SAXBuilder builder=new SAXBuilder();
//2.xml읽기
Document doc=builder.build(new URL("http://localhost:8080/jsp_prj/xml0327/att.xml"));
//3.최상위 부모노드 얻기->persons node
Element rootNode=doc.getRootElement();
//4.처음 자식 노드들 얻기->person
Iterator<Element> personNodes=rootNode.getChildren().iterator();
//5.얻어낸 모든 person node를 반복
Element personNode=null;
Attribute lastAtt=null; //lastName속성을 저장
Attribute cityAtt=null; //city속성을 저장
Attribute zipcodeAtt=null; //zipcode속성을 저장
String lastNameAtt="";
Iterator<Element> personSubNodes=null;
Element someNode=null; //person의 자식노드들 받기(name,address)
AttVO avo=null;
while(personNodes.hasNext()) { //personNodes얻어 반복시킨다.
personNode=personNodes.next(); //반복중인 personNodes하나 얻기
//person의 자식 노드들을 얻기->name,address
personSubNodes=personNode.getChildren().iterator();
while(personSubNodes.hasNext()) {
someNode=personSubNodes.next();//name,address
//입력된 성씨로 값을 생성해야 하므로 성씨가 있는 nameNode를 비교.
if("name".equals(someNode.getName())) {
lastAtt=someNode.getAttribute("lastName"); //성씨 속성 얻기
lastNameAtt=lastAtt.getValue(); //속성 값 얻기
//System.out.println(lastNameAtt);//김김노김정
if(lastName.equals(lastNameAtt)) { //김씨일때만 (name노드 사이의 값=김)
avo=new AttVO(); //값을 저장할 VO를 생성 하고
avo.setFirstName(someNode.getValue()); //getValue()=getText() //이름과
avo.setLastName(lastNameAtt); //성씨 추가
}//end if
}//end if
if(lastName.equals(lastNameAtt)) { //매개변수로 입력된 성씨와 같을 때
if("address".equals(someNode.getName())) { //address 노드 얻기
cityAtt=someNode.getAttribute("city"); //city속성 얻기
zipcodeAtt=someNode.getAttribute("zipcode"); //zipcode속성 얻기
avo.setCity(cityAtt.getValue());//생성된 VO에 city값
avo.setZipcode(zipcodeAtt.getValue());//address 값
avo.setAddress(someNode.getText());//노드 사이의 값 추가.
list.add(avo); //성씨가 일치했을때 parsing한 값을 가진 객체를 list에 추가
}//end if
}//end if
}//end while
}//end while
return list;
}//personData
/*xml과의 매칭이 중요!
public static void main(String[] args) {
AttParsing a=new AttParsing();
try {
//a.personData("김");
System.out.println(a.personData("박"));
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (JDOMException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}//end catch
}//main
*/
}//class
<%@page import="xml0327.AttVO"%>
<%@page import="java.util.List"%>
<%@page import="xml0327.AttParsing"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<link rel="stylesheet" type="text/css" href="http://localhost:8080/jsp_prj/common/main_v190130.css"/>
<style type="text/css">
#wrap{margin:0px auto;width:800px; height:860px;}
#header{width:800px; height:140px; background:#FFFFFF url(http://localhost:8080/jsp_prj/common/images/header_bg.png) repeat-x;
position: relative; }
#headerTitle{font-family: HY견고딕,고딕; font-size:35px; font-weight:bold; text-align:center;
/* padding-top: 35px */ position:absolute; top:40px; left:290px; }
#container{width:800px; min-height: 600px; }
#footer{width:800px; height:120px; }
#footerTitle{float: right; font-size:15px; padding-top:20px; padding-right:20px; }
</style>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.2.4/jquery.min.js"></script>
<script type="text/javascript">
$(function(){
$("#btn").click(function(){
$("[name='frm']").submit();
});//click
});//ready
</script>
</head>
<body>
<div id="wrap">
<div id="header">
<div id="headerTitle">SIST Class4</div>
<div style="padding-top:100px; ">
<c:import url="../common/jsp/main_menu.jsp"></c:import>
</div>
</div>
<div id="container">
<div>
<form name="frm" action="att_parsing.jsp" method="get">
<select id="lastName" name="lastName">
<option value="김">김씨</option>
<option value="이">이씨</option>
<option value="박">박씨</option>
<option value="노">노씨</option>
<option value="정">정씨</option>
<option value="최">최씨</option>
</select>
<input type="button" value="조회" id="btn" class="btn"/>
</form>
</div>
<c:if test="${not empty param.lastName}">
<div>
<div>선택하신 "${param.lastName}"으로 조회한 결과 입니다.</div>
<div>
<%
String lastName=request.getParameter("lastName");
AttParsing ap=new AttParsing();
List<AttVO> list=ap.personData(lastName);
pageContext.setAttribute("personList", list);
%>
<table border="1">
<tr>
<th width="100">성명</th>
<th width="400">주소</th>
</tr>
<c:if test="${empty personList}">
<tr>
<td colspan="2" align="center">검색결과가 존재하지 않습니다.</td>
</tr>
</c:if>
<c:forEach var="data" items="${personList}">
<tr>
<td>
<c:out value="${data.lastName}"/>
<c:out value="${data.firstName}"/>
</td>
<td>
${data.address} (${data.city},${data.zipcode})
</td>
</tr>
</c:forEach>
</table>
</div>
</div>
</c:if>
</div>
<div id="footer">
<div id="footerTitle">copyright© all right reserved. class 4.</div>
</div>
</div>
</body>
</html>
package xml0327;
public class AttVO {
private String firstName,lastName,city,zipcode,address;
public AttVO() {
}
public AttVO(String firstName, String lastName, String city, String zipcode, String address) {
this.firstName = firstName;
this.lastName = lastName;
this.city = city;
this.zipcode = zipcode;
this.address = address;
}
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
public String getCity() {
return city;
}
public void setCity(String city) {
this.city = city;
}
public String getZipcode() {
return zipcode;
}
public void setZipcode(String zipcode) {
this.zipcode = zipcode;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
@Override
public String toString() {
return "AttVO [firstName=" + firstName + ", lastName=" + lastName + ", city=" + city + ", zipcode=" + zipcode
+ ", address=" + address + "]";
}//toString
}//class
*XML생성
-
///자바만가지고/파서를 가지고 만들 수 있다.
-
Java
-
///탐캣에서 발생
-
1.데이터 얻기
-
2.얻은 데이터로 xml형태의 String생성 //ex) <?xml varsion="1.0"...><부모노드>...
-
3.출력스트림으로 출력
package xml0327;
import java.io.BufferedWriter;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.util.ArrayList;
import java.util.List;
public class CreateXml {
public List<String> data(){
List<String> list=new ArrayList<String>();
list.add("월래 먹는 날");
list.add("화끈하게 먹는 날");
list.add("수도없이 먹는 날");
list.add("목이 터지게 먹는 날");
list.add("금새먹고 또 먹는 날");
list.add("토하면서 먹는 날");
list.add("일일이 찾아다니며 먹는 날");
return list;
}//data
public String createXml(List<String> weekMsg) {
//xml생성과 관련된 업무
StringBuilder xml=new StringBuilder();
xml.append("<?xml version='1.0' encoding='UTF-8'?>\n");
xml.append("<week>\n");
for(int i=0; i<weekMsg.size(); i++) {
xml.append("\t<msg>").append(weekMsg.get(i)).append("</msg>\n");
}//end for
xml.append("</week>");
return xml.toString();
}//createXml
public void createXmlFile(String xml) throws IOException{
//파일화
BufferedWriter bw=null;
try {
bw=new BufferedWriter(new OutputStreamWriter(
new FileOutputStream("C:/dev/workspace/jsp_prj/WebContent/xml0327/msg.xml"),"UTF-8"));
bw.write(xml);
bw.flush();
}finally {
if(bw!=null) {bw.close();}//end if
}//end finally
}//createXmlFile
public static void main(String[] args) {
CreateXml c=new CreateXml();
try {
c.createXmlFile( c.createXml(c.data() ) );
} catch (IOException e) {
e.printStackTrace();
}//end catch
}//main
}//class
package xml0327;
import java.io.BufferedWriter;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.util.ArrayList;
import java.util.List;
public class CreateXml {
public List<String> data(){
List<String> list=new ArrayList<String>();
list.add("월래 먹는 날");
list.add("화끈하게 먹는 날");
list.add("수도없이 먹는 날");
list.add("목이 터지게 먹는 날");
list.add("금새먹고 또 먹는 날");
list.add("토하면서 먹는 날");
list.add("일일이 찾아다니며 먹는 날");
return list;
}//data
public String createXml(List<String> weekMsg) {
//xml생성과 관련된 업무
StringBuilder xml=new StringBuilder();
xml.append("<?xml version='1.0' encoding='UTF-8'?>\n");
xml.append("<week>\n");
for(int i=0; i<weekMsg.size(); i++) {
xml.append("\t<msg>").append(weekMsg.get(i)).append("</msg>\n");
}//end for
xml.append("</week>");
return xml.toString();
}//createXml
public void createXmlFile(String xml) throws IOException{
//파일화
BufferedWriter bw=null;
try {
bw=new BufferedWriter(new OutputStreamWriter(
new FileOutputStream("C:/dev/workspace/jsp_prj/WebContent/xml0327/msg.xml"),"UTF-8"));
bw.write(xml);
bw.flush();
}finally {
if(bw!=null) {bw.close();}//end if
}//end finally
}//createXmlFile
public static void main(String[] args) {
CreateXml c=new CreateXml();
try {
c.createXmlFile( c.createXml(c.data() ) );
} catch (IOException e) {
e.printStackTrace();
}//end catch
}//main
}//class
<<생성된 파일>>
<?xml version='1.0' encoding='UTF-8'?>
<week>
<msg>월래 먹는 날</msg>
<msg>화끈하게 먹는 날</msg>
<msg>수도없이 먹는 날</msg>
<msg>목이 터지게 먹는 날</msg>
<msg>금새먹고 또 먹는 날</msg>
<msg>토하면서 먹는 날</msg>
<msg>일일이 찾아다니며 먹는 날</msg>
</week>
-
Parser로 생성
-
1.xml문서 객체 생성 (선언부 생성 : <?xml varsion"1.0" ...?> )
-
Document doc=new Document();
-
2.최상위 부모노드 생성 (1개만 생성)
-
Element rootNode=new Element("부모노드 명");
-
3.자식노드 생성 (반복가능)
-
Element subNode=new Element("자식노드명");
-
//노드만 있고 값은 없다. ex)<노드명/>
-
4.노드에 들어갈 값 설정
-
subNode.setText(값); //<노드명>값</노드명>
-
5.속성을 가지는 경우
-
-속성 객체 생성
-
Attribute att=new Attribute("속성명","값");
-
-속성 객체를 노드객체에 추가
-
subNode.setAttribute(att);
-
//ex)<노드명 속성명="값">값</노드명>
-
6.자식노드를 부모노드에 추가 (반복해서 여러번)
-
rootNode.addContent(subNode);
-
//<부모노드>
-
//<자식노드 속성=값>값</자식노드>
-
//</부모노드>//선언부가 지금 없음
-
7.자식 노드를 가진 최상위 부모노드를 문서객체에 추가
-
doc.addContent(rootNode);
-
//<?xml varsion"1.0" ...?>
-
//<부모노드>
-
//<자식노드 속성=값>값</자식노드>
-
//</부모노드>
-
8.출력 객체 생성 (콘솔,파일,network)
-
XMLOutputter xout=new XMLOutputter();
-
xout.output(doc,출력스트림); //파일아웃풋은 파일로 소켓스트림이면 소켓타고 나갈 수도 있다.
package xml0327;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import org.jdom2.Document;
import org.jdom2.Element;
import org.jdom2.output.Format;
import org.jdom2.output.XMLOutputter;
public class CreateJdomXml {
public List<String> data(){
List<String> list=new ArrayList<String>();
list.add("월래 먹는 날");
list.add("화끈하게 먹는 날");
list.add("수도없이 먹는 날");
list.add("목이 터지게 먹는 날");
list.add("금새먹고 또 먹는 날");
list.add("토하면서 먹는 날");
list.add("일일이 찾아다니며 먹는 날");
return list;
}//data
public Document createXml(List<String> weekMsg) {
//xml생성과 관련된 업무
//1.xml문서 객체 생성
Document doc=new Document();
//2.최상위 부모노드 생성
Element rootNode=new Element("week");
Element msgNode=null;
for(String data:weekMsg) {
//3.자식 노드 생성
msgNode=new Element("msg");
//4.자식 노드에 값 설정
msgNode.setText(data);
//5.값을 가진 자식노드를 부모노드에 추가
rootNode.addContent(msgNode);
}//end for
//6.자식노드를 가진 부모노드를 xml 문서 객체에 추가
doc.addContent(rootNode);
return doc;
}//createXml
public void createXmlFile(Document doc) throws IOException{
//7.출력 객체 생성 : compact, raw format은 한줄로 출력한다.
//XMLOutputter x_out=new XMLOutputter();
//XMLOutputter x_out=new XMLOutputter(Format.getCompactFormat());
//XMLOutputter x_out=new XMLOutputter(Format.getRawFormat());
XMLOutputter x_out=new XMLOutputter(Format.getPrettyFormat());
//8.xml 문서 객체와 출력스트림을 사용하여 출력
x_out.output(doc, System.out);//Console에 출력
x_out.output(doc, new FileOutputStream("C:/dev/workspace/jsp_prj/WebContent/xml0327/jdom_msg.xml"));
//파일로 생성하면 한글이 깨지지 않는다.
}//createXmlFile
public static void main(String[] args) {
CreateJdomXml c=new CreateJdomXml();
try {
c.createXmlFile( c.createXml(c.data() ) );
} catch (IOException e) {
e.printStackTrace();
}//end catch
}//main
}//class
package xml0327;
public class DataVO {
private String carModel,company,owner,carType;
private int cc;
public DataVO() {
}
public DataVO(String carModel, String company, String owner, String carType, int cc) {
this.carModel = carModel;
this.company = company;
this.owner = owner;
this.carType = carType;
this.cc = cc;
}
public String getCarModel() {
return carModel;
}
public void setCarModel(String carModel) {
this.carModel = carModel;
}
public String getCompany() {
return company;
}
public void setCompany(String company) {
this.company = company;
}
public String getOwner() {
return owner;
}
public void setOwner(String owner) {
this.owner = owner;
}
public String getCarType() {
return carType;
}
public void setCarType(String carType) {
this.carType = carType;
}
public int getCc() {
return cc;
}
public void setCc(int cc) {
this.cc = cc;
}
}//class
<<<만들어진 파일>>
<?xml version="1.0" encoding="UTF-8"?>
<cars>
<car car_type="승용">
<model>아반테</model>
<company>현대</company>
<owner>김윤</owner>
<cc>1600</cc>
</car>
<car car_type="스포츠카">
<model>솔리드프로</model>
<company>넥슨</company>
<owner>김철</owner>
<cc>3000</cc>
</car>
<car car_type="스포츠카">
<model>연카</model>
<company>넥슨</company>
<owner>공</owner>
<cc>800</cc>
</car>
<car car_type="SUV">
<model>소렌토</model>
<company>기아</company>
<owner>이</owner>
<cc>4800</cc>
</car>
<car car_type="트럭">
<model>MAN트럭</model>
<company>MAN</company>
<owner>노</owner>
<cc>10000</cc>
</car>
</cars>
<<<<속성 parsing>>>
package xml0327;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import org.jdom2.Attribute;
import org.jdom2.Document;
import org.jdom2.Element;
import org.jdom2.output.Format;
import org.jdom2.output.XMLOutputter;
public class CreateJdomAttXml {
public List<DataVO> data(){
List<DataVO> list=new ArrayList<DataVO>();
list.add(new DataVO("아반테","현대","김정윤","승용",1600));
list.add(new DataVO("솔리드프로","넥슨","김희철","스포츠카",3000));
list.add(new DataVO("연카","넥슨","공선의","스포츠카",800));
list.add(new DataVO("소렌토","기아","이재찬","SUV",4800));
list.add(new DataVO("MAN트럭","MAN","노진경","트럭",10000));
return list;
}//data
public Document createXml(List<DataVO> carList) {
//1.xml문서 객체 생성
Document doc=new Document();
//2.최상위 부모노드 생성
Element rootNode=new Element("cars");
//자식 노드를 선언
Element carNode=null;
Element carModelNode=null;
Element companyNode=null;
Element ownerNode=null;
Element ccNode=null;
//속성 노드를 선언
Attribute carTypeAtt=null;
for(DataVO data:carList) {
//3.자식 노드 생성
carNode=new Element("car");
carModelNode=new Element("model");
companyNode=new Element("company");
ownerNode=new Element("owner");
ccNode=new Element("cc");
carTypeAtt=new Attribute("car_type", data.getCarType());
//4.자식 노드에 값 설정
carModelNode.setText(data.getCarModel());
companyNode.setText(data.getCompany());
ownerNode.setText(data.getOwner());
ccNode.setText(String.valueOf(data.getCc()));
//속성 설정
carNode.setAttribute(carTypeAtt);
//5.값을 가진 자식노드를 부모노드에 추가
//carNode에 자식노드 추가
carNode.addContent(carModelNode);
carNode.addContent(companyNode);
carNode.addContent(ownerNode);
carNode.addContent(ccNode);
//자식노드를 가진 car노드를 최상위 부모노드에 배치
rootNode.addContent(carNode);
}//end for
//6.자식노드를 가진 부모노드를 xml 문서 객체에 추가
doc.addContent(rootNode);
return doc;
}//createXml
public void createXmlFile(Document doc) throws IOException{
//7.출력 객체 생성 : compact, raw format은 한줄로 출력한다.
//XMLOutputter x_out=new XMLOutputter();
//XMLOutputter x_out=new XMLOutputter(Format.getCompactFormat());
//XMLOutputter x_out=new XMLOutputter(Format.getRawFormat());
XMLOutputter x_out=new XMLOutputter(Format.getPrettyFormat());
//8.xml 문서 객체와 출력스트림을 사용하여 출력
x_out.output(doc, System.out);//Console에 출력
x_out.output(doc, new FileOutputStream("C:/dev/workspace/jsp_prj/WebContent/xml0327/jdom_car.xml"));
//파일로 생성하면 한글이 깨지지 않는다.
}//createXmlFile
public static void main(String[] args) {
CreateJdomAttXml c=new CreateJdomAttXml();
try {
c.createXmlFile( c.createXml(c.data() ) );
} catch (IOException e) {
e.printStackTrace();
}//end catch
}//main
}//class
*DTD(Document Type Defition)
-
XML 작성규칙을 설정하는 일
-
=>태그의 등장순서
-
=>등장 횟수
-
=>속성 정보
-
//얘도 하나의 xml이다..
-
File저장은 확장자를 .dtd로 하지만 xml파일이다.
-
간단한 구조를 가진다. (복잡한 제어를 할 때에는 XML Schema작성)
-
///(간단제약->상세제약은 xml스키마?)
-
DTD를 사용한 xml이 작성규칙을 지키지 않으면 Error가 발생한다.
-
기호를 가지고 설정
-
사용기호)
사용기호 |
의미 (노드와 관련) |
* |
노드가 0~n개 까지 반복 될 수 있다. |
+ |
노드가 1~n개 까지 반복된다. |
? |
노드가 0~1개 까지 나올 수 있다.(안쓰여진 기본값) |
| |
노드가 둘 중 하나만 나와야 할 때 |
, |
순차적으로 |
#PCDATA |
노드가 파싱가능한 문자열 데이터를 가질 때 사용. |
#REQUIRED(리콰이어드) |
속성이 반드시 사용되어야 할 때 (속성과 관련) |
#FIXED |
속성이 고정된 값만 가져야 할 때 |
#IMPILED |
속성이 생략가능 할 때 |
CDATA |
속성이 문자열 값을 가질 때 |
///web.xml에 <web-app>나 <welcome-file-list>에 마우스를 가져다 놓으면 기호를 볼 수 있다.
///괄호에 감싸 뒤에 기호를 적용하면 그 기호가 기본값으로 적용된다
사용법)
<?xml version="1.0" encoding="UTF-8"?>
<!ELEMENT> //<-노드 정의
<!ELEMENT 노드명 (자식노드명 *+?!기호,,)*~기호가능> //<-노드의 자식노드 정의
<!ELEMENT 자식노드명 #PCDATA>
<!ATTLIST> //<-속성 정의
"test.dtd"
//동일한 노드명은 나중에 정의된 노드가 사용되므로 같은이름은 피해 구성해야 한다. |
-
필요한 xml에서 선언부를 정의하여 dtd를 사용한 xml 작성
-
<?Xml version ="1.0" encoding="UTF-8",Standalone="no"?)
-
<!DOCTYPE 적용노드명 SYSTEM "test.dtd">
-
<노드명> //ELEMENT규칙에 따라
-
<자식노드명>
<?xml version="1.0" encoding="UTF-8"?>
<!ELEMENT root (msg*)>
<!ELEMENT msg (#PCDATA)>
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- 0327추가 -->
<!DOCTYPE root SYSTEM "hello.dtd">
<root><!-- 최상위 부모노드/근노드? --><!-- root Elememt라고 안에 들은 태그들을 모두. -->
<msg>안녕XML</msg>
<msg>오늘은 화요일</msg><!-- 한줄을 Element -->
<!-- <msg>닫힘 노드가 없으면 Error //마크업언어의 주석은 다 동일-->
<!-- <hello>대소문자를 가린다.</Hello> -->
<msg/><!-- Element사이에 값이 없다면 /로 하나의 태그만 작성할 수 있다. -->
<!-- JSTL (Jsp Standard Tag Library) -->
<!-- 0327추가 -->
<!-- DTD에 선언되지 않은 태그는 사용할 수 없다.<msg1></msg1> -->
</root>
<!-- <root> //한번더 나오면 Error단 다른 부모노드로 감싸여 있으면 Error 아님
//최상위 부모노드는 반드시 하나만 존재해야 한다.
</root> -->
<?xml version="1.0" encoding="UTF-8"?>
<!ELEMENT depts (dept+)>
<!ELEMENT dept (deptno?,dname+,loc*)>
<!ELEMENT deptno (#PCDATA)>
<!ELEMENT dname (#PCDATA)>
<!ELEMENT loc (#PCDATA)>
<!-- 0327추가 -->
<!-- deptno는 ?이고, loc는 *이기 때문에 pass해도 되는것. -->
<dept>
<dname>부서미정</dname>
</dept>
<!-- n개를 가질수 있어 ErrorX -->
<dept>
<deptno>100</deptno>
<dname>고객지원부</dname>
<dname>(고지부)</dname>
<loc>서울</loc>
<loc>경기</loc>
<loc>대전</loc>
</dept>
<!-- DTD에 위배되는 구조:Error -->
<!-- 노드의 순서는 deptno,dname,loc의 순서를 가진다. -->
<!-- <dept>
순차적으로 읽어들이기 때문에 뒤죽박죽이면 파싱이 어려워진다.
<dname>1</dname>
<deptno>1</deptno>
<loc>1</loc>
</dept> -->
<!-- dname은 반드시 하나이상 나와야 한다. -->
<!-- <dept>
<deptno>100</deptno>
<loc>서울</loc>
</dept> -->
<!-- deptno는 0~1개 -->
<!-- <dept>
<deptno></deptno>
<deptno></deptno>
<dname></dname>
<loc></loc>
</dept> -->
<!-- 0327추가 -->
<!-- deptno는 ?이고, loc는 *이기 때문에 pass해도 되는것. -->
<dept>
<dname>부서미정</dname>
</dept>
<!-- n개를 가질수 있어 ErrorX -->
<dept>
<deptno>100</deptno>
<dname>고객지원부</dname>
<dname>(고지부)</dname>
<loc>서울</loc>
<loc>경기</loc>
<loc>대전</loc>
</dept>
<!-- DTD에 위배되는 구조:Error -->
<!-- 노드의 순서는 deptno,dname,loc의 순서를 가진다. -->
<!-- <dept>
순차적으로 읽어들이기 때문에 뒤죽박죽이면 파싱이 어려워진다.
<dname>1</dname>
<deptno>1</deptno>
<loc>1</loc>
</dept> -->
<!-- dname은 반드시 하나이상 나와야 한다. -->
<!-- <dept>
<deptno>100</deptno>
<loc>서울</loc>
</dept> -->
<!-- deptno는 0~1개 -->
<!-- <dept>
<deptno></deptno>
<deptno></deptno>
<dname></dname>
<loc></loc>
</dept> -->
<?xml version="1.0" encoding="UTF-8"?>
<!ELEMENT persons (person+)>
<!ELEMENT person (name?,ssn?,address+)>
<!ELEMENT name (firstName+,lastName?)>
<!ELEMENT ssn (#PCDATA)>
<!ELEMENT address (#PCDATA)>
<!ELEMENT firstName (#PCDATA)>
<!ELEMENT lastName (#PCDATA)>
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- 0327추가 -->
<!DOCTYPE persons SYSTEM "person.dtd">
<person>
<!-- wellFormed(적격) 문서는 작성규칙만 지켜서 만들면 된다.-위의 태그들과는 상관이 없음.
형제 노드와 다른 노드의 순서를 가지거나 더 추가해도 된다! -->
<!-- 0327추가 -->
<!-- valid 문서는 작셩규칙과 DTD에 정의된 규칙을 모두 지켜서 만들어야 한다. -->
<!-- <ssn>900101-*******</ssn> -->
<name>
<firstName>재찬</firstName>
<!-- <middleName>코잘잘</middleName> -->
<lastName>이</lastName>
</name>
<ssn>900101-*******</ssn>
<address>인천시 소래포구</address>
</person>
사용법)
<!ATTLIST 노드명 속성명 CDATA #REQUIRED(사용 옵션-값은 상관없고 속성은 반드시 정의해야 한다.)>
<!ATTLIST 노드명 속성명 CDATA #FIXED "값"(이 값으로 반드시 속성을 사용해야 할 때)>
<!ATTLIST 노드명 속성명 CDATA #IMPILED(속성을 생략할 수 있다)> |
<?xml version="1.0" encoding="UTF-8"?>
<!ELEMENT cars (car*)>
<!ELEMENT car (model?,company?,owner+,cc?)>
<!ELEMENT model (#PCDATA)>
<!ELEMENT company (#PCDATA)>
<!ELEMENT owner (#PCDATA)>
<!ELEMENT cc (#PCDATA)>
<!ATTLIST car car_type CDATA #REQUIRED>
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- 03.27추가 -->
<!DOCTYPE cars SYSTEM "jdom_car.dtd">
<!-- 03.27추가 -->
<!-- 속성을 정의하지 않으면 Error -->
<!-- <car>
<model>MAN트럭</model>
<company>MAN</company>
<owner>노진경</owner>
<cc>10000</cc>
</car> -->
<?xml version="1.0" encoding="UTF-8"?>
<!ELEMENT computers (computer)*>
<!ELEMENT computer (cpu+,mb?,ram+,ps+,(hdd?|ssd?),odd?,vga?)>
<!ELEMENT cpu (#PCDATA)>
<!ELEMENT mb (#PCDATA)>
<!ELEMENT ram (#PCDATA)>
<!ELEMENT ps (#PCDATA)>
<!ELEMENT hdd (#PCDATA)>
<!ELEMENT ssd (#PCDATA)>
<!ELEMENT odd (#PCDATA)>
<!ELEMENT vga (#PCDATA)>
<!ATTLIST cpu brand CDATA #REQUIRED>
<!ATTLIST mb brand CDATA #REQUIRED>
<!ATTLIST hdd brand CDATA #IMPLIED>
<!ATTLIST vga brand CDATA #FIXED "NVIDIA">
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE computers SYSTEM "computer.dtd">
<computers>
<computer>
<cpu brand="인텔">i5,3.30GHz</cpu>
<mb brand="기가바이트">GM001</mb>
<ram>16Gyte</ram>
<ps>7team</ps>
<hdd brand="WD">WD 1TByte</hdd>
<!-- <ssd></ssd>둘중 하나만 사용 -->
<odd>LG DVD</odd>
<vga brand="NVIDIA">GTX-2080</vga>
</computer>
</computers>
반응형
'국비지원학원 > XML,JSON,AJAX' 카테고리의 다른 글
108일차-JSONArray+Model2 (0) | 2019.04.11 |
---|---|
107일차-AJAX (0) | 2019.04.11 |
106일차-JSON/AJAX (0) | 2019.04.10 |
104일차-XML+Parser (0) | 2019.04.08 |
103일차-XML조금 (0) | 2019.04.04 |