XML 배경이야기
1. 정보의 호환성
- 문서간의 호환이 되지 못하는 이유는 서로 문서 포맷이 다르기 때문입니다
- 문서 포맷이 다르다는 것은 똑같은 모양의 문서를 작성한다 해도 문서를 저장할때 다른 방식으로
저장 하기 때문입니다
- 일반적인 텍스트 문서에서 사용된 문자들은 이미 표준화가 되어있기 때문입니다.(ANSI Charaacters)
- 이러한 호환성의 문제를 생각해 볼때 HTML파일이 텍스트를 기반으로 작성된다는 것은 당연하다고
볼수 있기 때문에 HTML을 통해 전세게에 있는 모든 사람들이 자유로이 정보를 공유할 수 있습니다.
- 그러나 특별히 정해진 규칙에 의해 작성된 데이터를 표현할 수 없습니다.
- 의미 있는 태그를 사용자가 원하는 대로 작성해서 프로그램을 통해 정보를 검색하고 수정하도록 개발된
것이 XML입니다.
2. XML과 HTML비교
HTML XML
사용자 태그를 만들수 없음 사용자 태그를 만들 수 있음
(정의된 태그만을 사용해야 함)
다른 곳에서 재사용할 수 없음 정보를 따로 다른곳에 재사용이 가능
단순히 문서를 출력함 웹을 통하여 정보를 주고 받음
문서내 정보검색이 어렵다 데이터의 저장과 표현을 분리하여
(검색엔진 필요) 데이터의 검색이 용이함
데이터를 CSS로 보여줌 XSL
데이터의 교환시 부가되는 데이터의 저장과 표현이 구분되어있어
작업량이 방대함 데이터의 교환이 용이함
3. XML의 시작
- XML 태그는 항상 쌍으로 적성되어야 한다 항상 끝태그가 이었야 함을 의미합니다.
<name>홍길순</name>
- XML 태그는 속성을 가질수 있습니다.
<name age="40">홍길순</name>
- 몸체가 없는경우
<name/>, <name></name>
- 대소문자 정확하게 지킵니다
- 안은 태그형식
<adress>
<name>
홍길순
</name>
</adress>
- XML 예제 => 브라우저에서 확인
<?xml version="1.0" encoding="euc-kr"?>
<portfolio>
<stock>
<symbol>SDS</symbol>
<name>삼성멀티캠퍼스</name>
<price>45000</price>
</stock>
<stock>
<symbol>LG</symbol>
<name>LG소프트스쿨</name>
<price>45000</price>
</stock>
<stock>
<symbol>HIT</symbol>
<name>현대정보기술</name>
<price>45000</price>
</stock>
</portfolio>
- '-'기호를 클릭해보면 폴더 구조처럼 닫혔다 열렸다 하는것을 볼수 있습니다.
이것은 브라우저에 XML 문서의 내용을 분석하기 위해서 필요한 XML Parser가 있기 때문입니다.(IE 5.0 이상포함)
4. XSLT
- 정보를 구조화 하는일은 XML이 담당하며, 구조화된 정보를 HTML과 같이 다른 형식의 문서로 변환하는 기술
이 바로 XSLT입니다.
- XSLT 예제
<<Mail.xml>>
<?xml version="1.0" encoding="euc-kr"?>
<?xml-stylesheet type="text/xsl" href="Mail.xsl" ?>
<mail>
<from>홍길순</from>
<to>홍길동</to>
<content>보고 싶어요</content>
</mail>
<<Mail.xsl>>
<?xml version="1.0" encoding="euc-kr" ?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl">
<xsl:template match="/">
<HTML>
<H1> 내용 : <xsl:value-of select="mail/content" /></H1>
<H2> FROM : <xsl:value-of select="mail/from" /></H2>
<H2> TO : <xsl:value-of select="mail/to" /></H2>
</HTML>
</xsl:template>
</xsl:stylesheet>
5. XML 파서
- XML Parser는 XML 문서의 구조를 분석하고 필요한 정보를 가져오는 일 뿐만 아니라 XML문서가 제대로
작성되었는지 등의 검사도 함께 수행합니다.
- XML Parser를 구현하는 인터페이스로서 DOM(Document Object Model)과 SAX(Simple API for XML)
두가지가 있습니다.
- DOM : XML 문서의 정보를 트리구조의 객체로 메모리에 읽어들여 XML 문서를 자유롭게 검색하며 작업을
할 수 있게 도와줍니다.
XML 전용 에디터 프로그램과 같이 항상 문서의 구조적인 정보를 메모리에 올려두고 조작을 해야
하는 상황에 사용하는것이 바람직합니다.
- SAX : 이벤트가 발생하면 발생된 이벤트에 의해서 정보를 조작합니다. 그러므로,
XML 처리가 빠르며 가볍습니다. 아주 큰용량의 XML 문서를 분석해야 한다면 DOM을 사용하여 분석하는
것보다 SAX를 사용하는 것이 시스템의 메모리를 좀더 적게 사용할 수 있습니다.
6. JDOM을 사용한 XML 정보 이용
1 JDOM 설치 (http://www.jdom.org)
: 자바기반의 응용 Parser
JDOM을 다운로드 받은후 합축해제후 build폴더의 jdom.jar를
Tomcat-5.0.19 /common/lib 폴더에 복사
2. XML 파일 읽어오기
: 작성된 XML파일을 MailViewBean으로 불러들이고 불러들인 정보를 jsp페이지에서 출력하는 예제
<< MailViewBean.java>>
package xmltest;
import java.io.*;
import java.util.*;
import org.jdom.*;
import org.jdom.input.*;
import org.jdom.output.*;
public class MailViewBean
{
private static String XML_FILE_DIR;
private static String XML_FILE_NAME;
SAXBuilder builder;
Document doc;
Element root;
public MailViewBean()
{
XML_FILE_DIR ="C:/Tomcat 5.0.19/webapps/jsp1400/xmltest";
XML_FILE_NAME="Mail.xml";
try {
builder = new SAXBuilder();
doc = builder.build(new File(XML_FILE_DIR,XML_FILE_NAME));
}catch(Exception e) {
e.printStackTrace();
}
}
public Hashtable getMailInfo()
{
Hashtable myXML = new Hashtable();
root = doc.getRootElement();
Element from=root.getChild("from");
Element to = root.getChild("to");
Element content = root.getChild("content");
myXML.put("from", from.getText());
myXML.put("to", to.getText());
myXML.put("content", content.getText());
return myXML;
}
}
<<MailView.jsp>>
<%@ page contentType="text/html;charset=euc-kr" %>
<%@ page import="java.util.*"%>
<jsp:useBean id="bean" class="xmltest.MailViewBean" />
<%
Hashtable mail=bean.getMailInfo();
String from =(String) mail.get("from");
String to = (String) mail.get("to");
String content = (String) mail.get("content");
%>
<html>
<head>
<title>JDOM 이용한 XML 분석</title>
</head>
<body>
<table width="90%" border="1" cellspacing="0" cellpadding="2" align="center">
<tr align="center" bgcolor="#996600">
<td colspan="3"><font color="#FFFFFF"><b>메일 읽기</b></font></td>
</tr>
<tr>
<td width="24%">보낸 분</td>
<td width="41%"><%=from%></td>
</tr>
<tr>
<td>받는 분</td>
<td><%=to%></td>
</tr>
<tr>
<td>내용</td>
<td><%=content%></td>
</tr>
</table>
</body>
</html>
7. XML에 데이터 입력
: 사용자로부터 입력받은 정보를 XML파일에 저장하고 저장된 값을읽어와 브라우저에 보여주는 예제
<<Address.xml
<?xml version="1.0" encoding="euc-kr"?>
<AddressList>
</AddressList>
<<Address.java
/*
* To change the template for this generated file go to
* Window>Preferences>Java>Code Generation>Code and Comments
*/
package xmltest;
import java.io.*;
import java.util.*;
import org.jdom.*;
import org.jdom.input.*;
import org.jdom.output.*;
public class Address
{
private static String XML_FILE_DIR;
private static String XML_FILE_NAME;
SAXBuilder builder;
Document doc;
Element root;
public Address()
{
XML_FILE_DIR ="e:/Tomcat-5.0.19/webapps/jsp/xmltest/";
XML_FILE_NAME="Address.xml";
try {
builder = new SAXBuilder();
doc = builder.build(new File(XML_FILE_DIR, XML_FILE_NAME));
}catch(Exception ex) {
ex.printStackTrace();
}
}
public Vector getAddrInfo()
{
root = doc.getRootElement();
List list=root.getChildren("Address");
Iterator it = list.iterator();
Vector vAddr = new Vector();
while ( it.hasNext()){
AddressBean address = new AddressBean();
Element emt = (Element)it.next();
address.setName(emt.getChild("name").getText());
address.setPhone(emt.getChild("phone").getText());
address.setAddr(emt.getChild("addr").getText());
vAddr.add(address);
}
return vAddr;
}
public boolean addElement(AddressBean address){
root = doc.getRootElement();
Element newEvent = new Element("Address");
Element name = new Element("name");
name.setText(address.getName());
newEvent.addContent(name);
System.out.println("name"+ address.getName());
Element phone = new Element("phone");
phone.setText(address.getPhone());
newEvent.addContent(phone);
Element addr = new Element("addr");
addr.setText(address.getAddr());
newEvent.addContent(addr);
root.addContent(newEvent);
XMLOutputter outputter = new XMLOutputter("",true,"euc-kr");
try{
FileWriter writer = new FileWriter(XML_FILE_DIR + XML_FILE_NAME);
outputter.output(doc, writer);
writer.close();
}catch(Exception ex)
{
ex.printStackTrace();
return false;
}
return true;
}
}
<<Address.jsp
<%@ page contentType="text/html;charset=euc-kr" %>
<%@ page import="java.util.*, xmltest.*" %>
<%
request.setCharacterEncoding("euc-kr");
String flag=request.getParameter("flag");
%>
<jsp:useBean id="bean" class="xmltest.AddressBean" />
<jsp:useBean id="addr" class="xmltest.Address" />
<jsp:setProperty name="bean" property="*" />
<%
if(flag != null && flag.equals("write")){
addr.addElement(bean);
}
Vector vAddr = addr.getAddrInfo();
%>
<html>
<body>
<table width="90%" border="1" cellspacing="0" cellpadding="2" align="center">
<tr align="center" bgcolor="#996600">
<td colspan="3"><font color="#FFFFFF"><b>주소 정보</b></font></td>
</tr>
<tr>
<td>이름</td>
<td>전화번호</td>
<td>주소</td>
</tr>
<% for(int i=0; i<vAddr.size();i++){
AddressBean temp =(AddressBean)vAddr.get(i);
%>
<tr>
<td><%=temp.getName()%></td>
<td><%=temp.getPhone()%></td>
<td><%=temp.getAddr()%></td>
</tr>
<%}%>
</table>
<form method="post" action="Address.jsp">
<table width="90%" border="1" cellspacing="0" cellpadding="2" align="center">
<tr align="center" bgcolor="#996600">
<td colspan="3"><font color="#FFFFFF"><b>주소 정보 입력</b></font></td>
</tr>
<tr>
<td>이름</td>
<td>전화번호</td>
<td>주소</td>
</tr>
<tr>
<td><input type="text" name="name"></td>
<td><input type="text" name="phone"></td>
<td><input type="text" name="addr"></td>
</tr>
<tr>
<td colspan="3" align="center"><input type="submit" value="등록"></td>
</tr>
</table>
<input type="hidden" name="flag" value="write" >
</form>
</body>
</html>
<<AddressBean.java
package xmltest;
public class AddressBean
{
String name="";
String phone="";
String addr="";
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
public String getAddr() {
return addr;
}
public void setAddr(String addr) {
this.addr = addr;
}
}
'리눅스와 웹개발' 카테고리의 다른 글
시스템 보안 I (32) | 2024.01.05 |
---|---|
XML FAQ (4) | 2023.12.06 |
DOM과 SAX의 특징 (7) | 2023.12.04 |
XML응용 분야의 예 (4) | 2023.12.03 |
Javascript로 XML 문서 핸들링 하기 (2) | 2023.12.01 |