반응형
*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© 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 사용
-
builder생성
-
SAXBuilder sb=new SAXBuilder();
-
XML을 문서 객체로 저장
-
Document doc=sb.build(new URL("http://....xml"))? //<?xml..xml자체가 여기에 저장됨+웹주소도 가능
-
최상위 부모노드를 얻는다.
-
Element rootNode=doc.getRootElement(); //<depts>
-
자식노드들 얻기
-
List<Element> deptNodes=rootNode.getChildren(); //<dept>|<dept> =>for
-
iterator<Element> .iterator(); //=>while
-
자식노드들 순환
-
while(deptNodes.hasnext()){
-
자식노드 얻기
-
Element someNode=deptNodes.next();
-
노드명
-
String name=someNode.getName();
-
노드값
-
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© 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 |