국비지원학원/XML,JSON,AJAX

105일차-XML+Parsing

초코맛 2019. 4. 8. 02:13
반응형
*속성 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&copy; 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&copy; 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