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

104일차-XML+Parser

초코맛 2019. 4. 8. 02:09
반응형
*XML
  • 태그를 사용자가 정의하여 사용하는 Markup 언어

SGML
HTML
-DTD존재(태그만 사용가능)
XML
-DTD존재X(태그를 사용자가 마음대로 정의)-> 통일성x-> (Parsing이 어렵다)    ↓
-DTD의 필요성 대두(DTD가 있으면 Parsing 수월)

MXML
-Flash쪽
-DTD존재해 정해진 태그만 사용
AXML
-마소에서 만듦
-DTD존재
  • 이 기종 언어간의 데이터 전달(만국공통어 같은 일->바디랭귀지)
    • C<->Java
    • Java<->JavaScript
    • Python<->Java
  • <노드명>값</노드명>
  • 프로그램내에서 사용할 값을 저장( 환경설정-server.xml,web.xml(DD)/국제화 )
  • ///xml자리에 치고 들어간게 JSON(xml의 사용성 감소)
  • 데이터 구조를 잘 표현하는 언어(사용자에게 보여지는 것이 아니다)
  • ///그 자체를 가지고 보여지지 않는다? ->그 자체를 가지고 서비스 하진 않음
  • Error가 발생한다.
    • 작성 규칙)=>지키지 않으면 Error
    • 시작노드와 끝노드는 반드시 쌍으로 사용한다.
    • 대소문자는 구분하여 사용한다.
    • 최상위 부모노드는 하나만 작성가능하다.
  • DTD없이 생성하는 XML (well-formed XML/적격문서)->작성규칙만 지켜 작성
  • vs
  • DTD를 정의하고 참조하여 작성하는 XML (valid XML/유효문서)->작성규칙과 DTD의 정의규칙을 지켜 만드는 문서
  • 공공데이터의 결과를 XML로 많이 제공
    • ///(요즘에는 JSON제공을 많이 한다./여전히 XML으로 제공하기도 함)=>2가지로 제공=>JSON이 용량도 적게들고 편함
  • 작성법)
  • 1.선언부-무조건 첫줄! 엔터도 ㄴㄴ
    • <?xml version="1.0" encoding="UTF-8" standalone="yes|no"?>
      • standalone="yes|no"=>DTD의 여부
    • <!DOCTYPE 적용노드명 SYSTEM "DTD의 위치"|PUBLIC "DTD의 URL">
      • DOCTYPE-DTD가 존재할때 
      • SYSTEM -DTD가 내 하드디스크에 있을때
      • PUBLIC - DTD가 다른 웹서버에 있을때
    • <부모노드>   //이때 자식노드는 부모노드 하나..?
      • <자식노드>//n개-형제노드
      • </자식노드>
    • </부모노드>
    • /////DOM TREE-태그를 나무형태로 그린것
    • ////어디에서 봐도 다 똑같이 보인다.
<?xml version="1.0" encoding="UTF-8"?>
<!-- 여기는 띄어도 가능! -->
<root><!-- 최상위 부모노드/근노드? --><!-- root Elememt라고 안에  들은 태그들을 모두. -->
     <msg>안녕XML</msg>
     <msg>오늘은 화요일</msg><!-- 한줄을 Element -->
     <!-- <msg>닫힘 노드가 없으면 Error //마크업언어의 주석은 다  동일-->
     <!-- <hello>대소문자를 가린다.</Hello> -->
     <msg/><!-- Element사이에 값이 없다면 /로 하나의 태그만  작성할 수 있다. -->
     <!-- JSTL (Jsp Standard Tag Library) -->
</root>
<!-- <root> //한번더 나오면 Error단 다른 부모노드로 감싸여 있으면  Error 아님
//최상위 부모노드는 반드시 하나만 존재해야 한다.
</root> -->
  • ///HTML에 테이블에 값이 들어갔을땐 값이 무슨 값인지 알수 없지만 XML의 <age><name>태그에 넣으면 무슨 값인지 정확하게 알 수 있게 된다.
<!--HDD파일-a.xml-->
<?xml version="1.0"...?>

<names>
     <name>이재찬</name>
     <name> 김정윤</name>
     <name> 공선의</name>
</names>
------------
F.R   -  B.R
------------
JVM-Memory
1.Stream 연결
BufferedReader br=new BufferedReader(new FileReader("xml의 경로"));
2.줄 단위 끝까지 읽어 들이기
String temp="";
String data="";
while( (temp=br.readLine() ) != null){
3.원하는 태그인지?
if(temp.contains("<name>")){
4.파싱
data=temp.substring(temp.indexOf(">")+1, temp.lastIndexOf("<"));
}//end if
}//end while
<?xml version="1.0" encoding="UTF-8"?>
<persons>
     <person>
           <name>
                <firstName>윤</firstName>
                <lastName>김</lastName>
           </name>
           <ssn>880101-*******</ssn>
           <address>서울시 강남</address>
     </person>
     <person>
           <name>
                <firstName>경</firstName>
                <lastName>노</lastName>
           </name>
           <ssn>890101-*******</ssn>
           <address>서울시 강서</address>
     </person>
     <person>
           <!-- wellFormed(적격) 문서는 작성규칙만 지켜서 만들면  된다.-위의 태그들과는 상관이 없음.
                형제 노드와 다른 노드의 순서를 가지거나 더  추가해도 된다! -->
           <ssn>900101-*******</ssn>
           <name>
                <firstName>찬</firstName>
                <middleName>코잘잘</middleName>
                <lastName>이</lastName>
           </name>
           <address>인천시</address>
     </person>
</persons>
<?xml version="1.0" encoding="UTF-8"?>
<books>
     <book>
           <title>Java의 정석</title>
           <author>남궁성</author>
           <company>도우출판</company>
           <price>27000</price>
           <isbn>123-123-1234</isbn>
     </book>
     <book>
           <title>JSP2.3 웹프로그래밍</title>
           <author>최범균</author>
           <company>가메출판사</company>
           <price>30000</price>
           <isbn>222-2343-189011</isbn>
     </book>
     <book>
           <title>안경없이 모든 세상의 작은 글자 보기</title>
           <author>정택성</author>
           <company>택성춢판사</company>
           <price>1500</price>
           <isbn>2212-45113-1234011</isbn>
     </book>
     <book>
           <title>장거리 출퇴근에 해야할 항목들</title>
           <author>이재찬</author>
           <company>송도춢판사</company>
           <price>8000</price>
           <isbn>112-1444-37911</isbn>
     </book>
     <book>
           <title>대인관계의 대처법과 재설정</title>
           <author>공선의</author>
           <company>목동사</company>
           <price>7500</price>
           <isbn>4991-4311-30</isbn>
     </book>
</books>
<?xml version="1.0" encoding="UTF-8"?>
<!-- 부서정보를 저장하는 XML -->
<depts>
     <dept>
           <deptno>10</deptno>
           <dname>SI 개발부</dname>
           <loc>서울</loc>
     </dept>
     <dept>
           <deptno>20</deptno>
           <dname>SM 유지보수</dname>
           <loc>경기도</loc>
     </dept>
     <dept>
           <deptno>30</deptno>
           <dname>SE 시스템엔지니어</dname>
           <loc>서울</loc>
     </dept>
     <dept>
           <deptno>40</deptno>
           <dname>QA</dname>
           <loc>부산</loc>
     </dept>
</depts>

<<파서가 없어도 자바로 Parsing가능>>>

<?xml version="1.0" encoding="UTF-8"?>
<names>
     <name>공</name>
     <name>이</name>
     <name>오</name>
     <name>박</name>
     <name>최</name>
     <name>김</name>
</names>
<%@page import="java.io.FileInputStream"%>
<%@page import="java.io.InputStreamReader"%>
<%@page import="java.io.FileReader"%>
<%@page import="java.io.File"%>
<%@page import="java.io.BufferedReader"%>
<%@page import="java.util.ArrayList"%>
<%@page import="java.util.List"%>
<%@page import="java.io.IOException"%>
<%@page import="java.sql.SQLException"%>
<%@page import="kr.co.sist.diary.vo.DiaryDetailVO"%>
<%@page import="kr.co.sist.diary.dao.DiaryDAO"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%!
     public List<String> xmlParsing() throws IOException{
           List<String> list=new ArrayList<String>();
           //1.XML과 연결
           
           BufferedReader br=null;
           try{
                File file=new  File("C:/dev/workspace/jsp_prj/WebContent/xml0326/names.xml");
                
                br=new BufferedReader(new InputStreamReader(new  FileInputStream(file), "UTF-8"));
                
                //2.줄단위로 읽어 들인다.
                String temp="";
                while( (temp=br.readLine()) !=null){
                     if(temp.contains("<name>")){//줄단위로  읽어들인 내용에 <name>노드가 있다면
                          list.add(temp.substring(temp.indexOf(">")+1,temp.lastIndexOf("<")) );
                     }//end if
                }//end while
           }finally{
                if(br != null){ br.close(); }//end if
           }//end finally
           
           return list;
     }//xmlParsing
%>
<!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; 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>
</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">
     <table border="1">
     <tr>
           <td width="100">이름</td>
     </tr>
     <c:forEach var="name" items="<%=xmlParsing()%>">
           <tr>
                <td style="text-align: center;">${name}</td>
           </tr>
     </c:forEach>
     </table>
     </div>
     
     <div id="footer">
           <div id="footerTitle">copyright&copy; all right  reserved. class 4.</div>
     </div>
</div>
</body>
</html>




*Parser
  • XML을 Parsing할 수 있는 도구
  • ///java만 갖고 있다면 얼마든지 Parsing가능하긴 함
  • SAX(Simple A XML)방식 Parser
    • 줄 단위로 XML을 분석하여 Parsing 하는 도구
    • SUN사에서 제공/제안

  • vs
  • DOM(  )방식 Parser
    • Node를 객체로 만들어 작업
    • IBM사에서 제안
    • 사용상의 편의성이 SAX방식보다 좋다.
    • 단)파일이 크다면 속도가 느려질 것.
    • ///하나하나 객체로 보고 사용
  • JDOM2 Parser 사용

<?xml version="1.0"
<depts>
     <dept>//최상위 부모노드,근노드
           <dname>SI</dname>
           <loc>서울</loc>
           <deptno>10</deptno>
     </dept>
     <dept>
           <dname>SM</dname>
           <loc>대구</loc>
           <deptno>20</deptno>
     </dept>
</depts>
DOM Tree

 

 
//jdom-2.0.6.-javadoc에 index.html이 API

 

*JDOM Parser 사용
  1. builder생성
    • SAXBuilder sb=new SAXBuilder();
  2. XML을 문서 객체로 저장
    • Document doc=sb.build(new URL("http://....xml"))?   //<?xml..xml자체가 여기에 저장됨+웹주소도 가능
  3. 최상위 부모노드를 얻는다.
    • Element rootNode=doc.getRootElement();  //<depts>
  4. 자식노드들 얻기
    • List<Element> deptNodes=rootNode.getChildren(); //<dept>|<dept> =>for
    • iterator<Element>                                                    .iterator();   //=>while
  5. 자식노드들 순환
    • while(deptNodes.hasnext()){
  6. 자식노드 얻기
      • Element someNode=deptNodes.next();
  7. 노드명
    • String name=someNode.getName();
  8. 노드값
      • String val=someNode.getText();
    • }
package day0326;
import java.io.IOException;
importjava.net.URL;
import java.util.Iterator;
import org.jdom2.Document;
import org.jdom2.Element;
import org.jdom2.JDOMException;
import org.jdom2.input.SAXBuilder;
/**
* JDOM Parser 사용
* @author owner
*/
public class UseJDOMParser {
     
     public UseJDOMParser() throws JDOMException, IOException {
           //1.Parser 생성
           SAXBuilder builder=new SAXBuilder();
           //2.XML문서를 객체에 저장
           //local
//         Document doc=builder.build(new  File("C:/dev/workspace/jsp_prj/WebContent/xml0326/names.xml"));
           //web server
           Document doc=builder.build(new  URL("http://localhost:8080/jsp_prj/xml0326/names.xml"));
           //3.문서객체에서 최상위 부모노드 얻기
           Element rootNode=doc.getRootElement();
           //4.부모노드의 자식노드 얻기
           Iterator<Element>  namesNode=rootNode.getChildren().iterator();
           //자식노드 순환
           Element nameNode=null;
           while(namesNode.hasNext()) {
                //자식노드 얻기
                nameNode=namesNode.next();
                System.out.println("노드명:  "+nameNode.getName());
                System.out.println("노드값:  "+nameNode.getText());
                System.out.println("노드값:  "+nameNode.getValue());
           }//end while
           
     }//UseJDOMParser
     public static void main(String[] args) {
           try {
                new UseJDOMParser();
           }catch (JDOMException e) {
                e.printStackTrace();
           }catch (IOException ie) {
                ie.printStackTrace();
           }//end catch
     }//main
}//class


<<jtbc에서 제공하는 Rss로 Parsing하기>>>

<%@page import="day0326.RssVO"%>
<%@page import="day0326.JtbcRssParsing"%>
<%@page import="java.io.FileInputStream"%>
<%@page import="java.io.InputStreamReader"%>
<%@page import="java.io.FileReader"%>
<%@page import="java.io.File"%>
<%@page import="java.io.BufferedReader"%>
<%@page import="java.util.ArrayList"%>
<%@page import="java.util.List"%>
<%@page import="java.io.IOException"%>
<%@page import="java.sql.SQLException"%>
<%@page import="kr.co.sist.diary.vo.DiaryDetailVO"%>
<%@page import="kr.co.sist.diary.dao.DiaryDAO"%>
<%@ 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; }
td{padding: 3px;}
</style>
<script  src="https://ajax.googleapis.com/ajax/libs/jquery/2.2.4/jquery.min.js"></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 id="subject" style="text-align: center; margin-top:  20px;">
           [<a href="jtbc_rss.jsp?title=newsflash">속보</a> |
           <a href="jtbc_rss.jsp?title=politics">정치</a> |
           <a href="jtbc_rss.jsp?title=economy">경제</a> |
           <a href="jtbc_rss.jsp?title=society">사회</a> |
           <a href="jtbc_rss.jsp?title=international">국제</a> |
           <a href="jtbc_rss.jsp?title=culture">문화</a>    |
           <a href="jtbc_rss.jsp?title=entertainment">연예</a> |
           <a href="jtbc_rss.jsp?title=sports">스포츠</a> |
           <a href="jtbc_rss.jsp?title=fullvideo">풀영상</a> |
           <a href="jtbc_rss.jsp?title=newsrank">뉴스랭킹</a> |
           <a href="jtbc_rss.jsp?title=newsroom">뉴스룸</a>]
     </div>
     <div id="newsView">
     <%
     String title=request.getParameter("title");
     if(title==null){
           title="newsflash";
     }//end if
     JtbcRssParsing jrp=JtbcRssParsing.getInstance();
     List<RssVO> list=jrp.getNews(title);
     pageContext.setAttribute("newsList", list);
     %>
     <c:if test="${empty newsList}">
           네트워크 연결이 불안정합니다. 잠시 후 다시 시도해주세요.
     </c:if>
     
     <c:forEach var="news" items="${newsList}">
     <table style="border:1px solid #333; border-spacing: 0px;  margin-top: 6px;">
     <tr>
           <td style="width:50px; text-align: center;  border-right: 1px solid #333; ">제목</td>
           <td colspan="3" style="width:650px; text-align:  center;">
                <c:out value="${news.title}"/>
           </td>
     </tr>
     <tr>
           <td style="width:50px; text-align: center;  border-right: 1px solid #333;">링크</td>
           <td style="width:300px; text-align: left;">
                <a href="${news.link}" target="_new">뉴스이동</a>
           </td>
           <td style="width:50px; text-align:  center;">작성일</td>
           <td style="width:300px; text-align: left;">
                <c:out value="${news.pubDate}"/>
           </td>
     </tr>
     <tr>
           <td style="width:50px; text-align: center;  border-right: 1px solid #333;">설명</td>
           <td style="height:50px; text-align: left;  width:650px;" colspan="3">
                <c:out value="${news.description}"/>
           </td>
           
     
     </table>
     </c:forEach>
     </div>
     
     </div>
     <div id="footer">
           <div id="footerTitle">copyright&copy; all right  reserved. class 4.</div>
     </div>
</div>
</body>
</html>
package day0326;
import java.io.IOException;
importjava.net.URL;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.jdom2.Document;
import org.jdom2.Element;
import org.jdom2.JDOMException;
import org.jdom2.input.SAXBuilder;
public class JtbcRssParsing {
     
     private static JtbcRssParsing jrp;
     
     private JtbcRssParsing() {
           
     }//JtbcRssParsing
     
     public static JtbcRssParsing getInstance() {
           if(jrp==null) {
                jrp=new JtbcRssParsing();
           }//end if
           return jrp;
     }//getInstance
     
     public List<RssVO> getNews(String rssName) throws  IOException, JDOMException{
           List<RssVO> list =new ArrayList<RssVO>();
           
           //1.Builder 생성
           SAXBuilder builder=new SAXBuilder();
           //2.URL로 외부 서버에서 제공하는 RSS 문서 객체 얻기
           Document doc=builder.build(new  URL("http://fs.jtbc.joins.com/RSS/"+rssName+".xml"));
           //3.최상위 부모노드 얻기
           Element rootNode=doc.getRootElement();//rss node
           //4.부모노드의 자식노드(channel) 얻기
           Element channelNode=rootNode.getChild("channel");
           //5.channel node의 자식노드들 얻기
           Iterator<Element>  someNodes=channelNode.getChildren().iterator();
           
           Element someNode=null;
           Iterator<Element> itemSubNodes=null;
           Element ItemSubNode=null;
           
           RssVO rv=null;
           while(someNodes.hasNext()) {//채널 노드의 자식  노드들을 순환
                someNode=someNodes.next();//자식
                if("item".equals(someNode.getName())){
                     //item노드의 모든 자식들 얻기
                     itemSubNodes=someNode.getChildren().iterator();
                     
                     rv=new RssVO();
                     while(itemSubNodes.hasNext()) {
                           ItemSubNode=itemSubNodes.next();
                          if("title".equals(ItemSubNode.getName())) {
                                rv.setTitle(ItemSubNode.getText());
                           }//end if
                          if("link".equals(ItemSubNode.getName())) {
                                rv.setLink(ItemSubNode.getText());
                           }//end if
                          if("description".equals(ItemSubNode.getName())) {
                                rv.setDescription(ItemSubNode.getText());
                           }//end if
                          if("pubDate".equals(ItemSubNode.getName())) {
                                rv.setPubDate(ItemSubNode.getText());
                           }//end if
                           
                     }//end while
                     list.add(rv);
                }//end if
           }//end while
           //System.out.println(channelNode);
           return list;
     }//getNews
     
     /*
     public static void main(String[] args) {
           JtbcRssParsing jrp=JtbcRssParsing.getInstance();
           try {
                System.out.println(jrp.getNews("newsflash"));
           } catch (IOException e) {
                e.printStackTrace();
           } catch (JDOMException e) {
                e.printStackTrace();
           }
     }//main
*/   
}//class
package day0326;
public class RssVO {
     private String title,link,description,pubDate;
     public RssVO() {
     }
     public RssVO(String title, String link, String  description, String pubDate) {
           this.title = title;
           this.link = link;
           this.description = description;
           this.pubDate = pubDate;
     }
     
     public String getTitle() {
           return title;
     }
     public void setTitle(String title) {
           this.title = title;
     }
     public String getLink() {
           return link;
     }
     public void setLink(String link) {
           this.link = link;
     }
     public String getDescription() {
           return description;
     }
     public void setDescription(String description) {
           this.description = description;
     }
     public String getPubDate() {
           return pubDate;
     }
     public void setPubDate(String pubDate) {
           this.pubDate = pubDate;
     }
     
     @Override
     public String toString() {
           return "RssVO [title=" + title + ", link=" + link +  ", description=" + description + ", pubDate=" + pubDate
                     + "]";
     }
     
}//class

 

반응형

'국비지원학원 > XML,JSON,AJAX' 카테고리의 다른 글

108일차-JSONArray+Model2  (0) 2019.04.11
107일차-AJAX  (0) 2019.04.11
106일차-JSON/AJAX  (0) 2019.04.10
105일차-XML+Parsing  (0) 2019.04.08
103일차-XML조금  (0) 2019.04.04