DOM파싱 수정, 삭제

DOM파싱 수정, 삭제

XML파일

<?xml version=”1.0″ encoding=”UTF-8″ standalone=”no”?>
<sawon>
    <list>
        <sabun>1</sabun>
        <name>홍길동</name>
        <dept>영업부</dept>
        <loc>서울</loc>
        <hiredate>2010-05-02</hiredate>
    </list>
    <list>
        <sabun>2</sabun>
        <name>심청이</name>
        <dept>기획부</dept>
        <loc>서울</loc>
        <hiredate>2010-05-02</hiredate>
    </list>
    <list>
        <sabun>3</sabun>
        <name>박문수</name>
        <dept>개발부</dept>
        <loc>서울</loc>
        <hiredate>2010-05-02</hiredate>
    </list>

</sawon>

 

클래스 선언과 생성자

package com.xml;

import java.util.*;
import java.io.*;
import java.text.*;//날짜변환

import javax.xml.parsers.*;//파싱
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.*;
import javax.xml.transform.stream.*;

import org.w3c.dom.*;//돔

import com.sun.org.apache.xalan.internal.xsltc.cmdline.Transform;

public class SawonXML {

  //                 > Sawon    > list    >   sabun  >
  // Document > Element > Element > Element > text
  private Document doc; //전역 DB. 파싱된 위치를 도큐먼트라고 한다. DB로 따지면 ORCL이다. (전역 데이터베이스가 ORCL이다)
  private Element root; //테이블. 테이블명을 엘리먼트라고 한다.
  private String path=”C:\\webDev2\\workspace\\XMLProject2\\WebContent\\WEB-INF\\data\\sawon.xml”;//XML위치
  private static SawonXML xml;//싱글턴 패턴. static을 쓴다. 메모리를 하나만 써야 하기 때문에 쓴다.

 

   public SawonXML(){
  try{
   // ■파서기 생성
   // 파서: xml을 읽어서 트리 형태로 메모리에 저장(파싱:xml->doc)
   //HTML, XML, WML 등을 파싱할 수 있다.
   //파서기: 인터페이스로 되어있다
   DocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance();
   
   //DocumentBuilder는 인터페이스이다.
   //인터페이스는 추상클래스의 일종이므로, 스스로 new를 할 수 없기에 DocumentBuilderFactory를 이용해서 메모리 할당한다.
   DocumentBuilder db=dbf.newDocumentBuilder();
   
   // ■저장공간 확보
   doc = db.parse(new File(path));
   //doc가 xml 정보를 다 가진다.
   
   // ■테이블(최상위 태그) 가져옴    역파싱(doc->xml file로 바꿀 수 있다) 다시 말해, 돔은 crud가 가능하다.
   root=doc.getDocumentElement();
   
  }catch(Exception ex){System.out.println(ex.getMessage());}
}

 public static SawonXML newInstance(){
  if(xml==null)
   xml=new SawonXML();
  return xml;
 }

 

   ……….. //이 부분에 DOC 제어에 관한 것들을 넣는다.

}

 

DOC 제어(SawonXML 내에 작성)

xml의 데이터 삭제

public class SawonXML {

   (중략)………..

 public void sawonDelete(int sabun){
  try{
   NodeList list=root.getElementsByTagName(“list”);
   for(int i=0;i<list.getLength();i++){
    list=root.getElementsByTagName(“sabun”);
    String sa=list.item(i).getFirstChild().getNodeValue();
    list=root.getElementsByTagName(“list”);
    if(sabun==Integer.parseInt(sa)){
     Element listElem=(Element)list.item(i);
     root.removeChild(listElem);
     xmlSave();
     break;
    }//if 
   }//for
  }//try
  catch(Exception ex){System.out.println(ex.getMessage());}
 }

   (중략)………..

}

 

xml에 데이터 추가

public class SawonXML {

   (중략)………..

public void sawonInsert(SawonVO vo){
  try{
   //리스트 노드 만든다
   Element list=doc.createElement(“list”);
   // <list></list>까지 한 쌍을 만들어준다.
   
   //나머지 노드 만든다
   Element sabun=doc.createElement(“sabun”);
   // <sabun></sabun> => 사이에 넣는걸 어펜드 차일드라고 함
   Text stxt=doc.createTextNode(String.valueOf(sawonMax()));//텍스트 노드를 만들어서 넣어야 함
   sabun.appendChild(stxt);
   
   Element name=doc.createElement(“name”);
   Text ntxt=doc.createTextNode(vo.getName());
   name.appendChild(ntxt);
   
   Element dept=doc.createElement(“dept”);
   Text dtxt=doc.createTextNode(vo.getDept());
   dept.appendChild(dtxt);
   
   Element loc=doc.createElement(“loc”);
   Text ltxt=doc.createTextNode(vo.getLoc());
   loc.appendChild(ltxt);
   
   Element hiredate=doc.createElement(“hiredate”);
   SimpleDateFormat sdf=new SimpleDateFormat(“yyyy-mm-dd”);
   Text htxt=doc.createTextNode(sdf.format(new Date()));
   hiredate.appendChild(htxt);
   
   //5개 노드를 사원 밑에 다 붙인다
   list.appendChild(sabun);
   list.appendChild(name);
   list.appendChild(dept);
   list.appendChild(loc);
   list.appendChild(hiredate);
   
   root.appendChild(list);
   
   xmlSave();
   
  }catch(Exception ex){
   System.out.println(ex.getMessage());
  }
 }

   (중략)………..
}

 

xml을 저장 (DOC를 XML로 변환):

※추가/삭제한 것을 반영

public class SawonXML {

   (중략)………..

  public void xmlSave(){
  
  try{
   TransformerFactory tff=TransformerFactory.newInstance();
   Transformer tf=tff.newTransformer();
   tf.setOutputProperty(OutputKeys.INDENT,”yes”);//들여쓰기
   tf.setOutputProperty(OutputKeys.ENCODING,”UTF-8″);
   DOMSource dom=new DOMSource(doc);
   StreamResult sr=new StreamResult(path);//XML파일로 보냄
   
   tf.transform(dom, sr);
   
  }catch(Exception ex){
   System.out.println(ex.getMessage());
  }

   (중략)………..
}

 

XML 내에서 검색

public class SawonXML {

   (중략)………..

 public SawonVO sawonFindData(int sabun){
  SawonVO vo=new SawonVO();
  try{
   NodeList node=root.getElementsByTagName(“list”);
   for(int i=0;i<node.getLength();i++){
    node=root.getElementsByTagName(“sabun”);
    String sa=node.item(i).getFirstChild().getNodeValue();//사번값 첫번째 값을 가져온다
    node=root.getElementsByTagName(“name”);
    String name=node.item(i).getFirstChild().getNodeValue();
    node=root.getElementsByTagName(“dept”);
    String dept=node.item(i).getFirstChild().getNodeValue();
    node=root.getElementsByTagName(“loc”);
    String loc=node.item(i).getFirstChild().getNodeValue();
    node=root.getElementsByTagName(“hiredate”);
    String hiredate=node.item(i).getFirstChild().getNodeValue();
    
    if(sabun==Integer.parseInt(sa)){
     vo.setSabun(Integer.parseInt(sa));
     vo.setName(name);
     vo.setDept(dept);
     vo.setLoc(loc);
     vo.setHiredate(hiredate);
     break;
    }
   }
   
  }
  catch(Exception ex){System.out.println(ex.getMessage());}
  return vo;
 }

   (중략)………..
}

 

XML내에서 읽기1(목록 출력) (오라클의 SELECT)

public class SawonXML {

   (중략)………..

 public ArrayList<SawonVO> sawonAllData(){
  ArrayList<SawonVO> list=new ArrayList<SawonVO>();
  try{
   //노드 리스트로 묶는다.
   //루트부터 시작해서 값을 가져온다.
   NodeList node=root.getElementsByTagName(“list”);
   for(int i=0;i<node.getLength();i++){
    node=root.getElementsByTagName(“sabun”);
    String sabun=node.item(i).getFirstChild().getNodeValue();//사번값 첫번째 값을 가져온다
    node=root.getElementsByTagName(“name”);
    String name=node.item(i).getFirstChild().getNodeValue();
    node=root.getElementsByTagName(“dept”);
    String dept=node.item(i).getFirstChild().getNodeValue();
    node=root.getElementsByTagName(“loc”);
    String loc=node.item(i).getFirstChild().getNodeValue();
    node=root.getElementsByTagName(“hiredate”);
    String hiredate=node.item(i).getFirstChild().getNodeValue();
    SawonVO vo=new SawonVO();
    vo.setSabun(Integer.parseInt(sabun));
    vo.setName(name);
    vo.setDept(dept);
    vo.setLoc(loc);
    vo.setHiredate(hiredate);
    list.add(vo);
   }
  }catch(Exception ex){ex.getMessage();}
  return list;
 }

   (중략)………..
}

 

XML내에서 읽기2 (오라클의 SELECT)

public class SawonXML {

   (중략)………..

  public int sawonMax(){
  int sabun=0;
  try{
   NodeList list=root.getElementsByTagName(“list”);
   for(int i=0;i<list.getLength();i++){
    // 1 2 3
    list=root.getElementsByTagName(“sabun”);
    String sa=list.item(i).getFirstChild().getNodeValue();
    if(sabun<Integer.parseInt(sa)){
     sabun=Integer.parseInt(sa);
     
    }
   }
  }catch(Exception ex){
   System.out.println(ex.getMessage());
  }
  return sabun+1;
 }

   (중략)………..
}