본문 바로가기

Server Oriented/Java & JSP

jQuery 와 Java 로 XML DOM 다루기


o 먼저는 jQuery 로 XML 데이타 가져오는 방법
   http://www.xgenesis.org/webProgramming/5927995

$.ajax({
  type: "get", // post
  url : "sample.xml",
  dataType : "xml",
  success: function(xml) {
    $(xml).find("data").each(function(){ // $(xml) 은 Ajax 리턴값의 Root Tag. each() 는 find 결과가 배열일 경우에 대한 방비
      var title = $(this).find("title").text(); // attr('AttrName') 속성값 추출
      var linkUrl = $(this).find("link_url").text();
      var linkTarget = $(this).find("link_target").text();
      var link = "<a href='"+linkUrl+"' target='"+linkTarget+"'>"+title+"<a>";
      alert(link);
    });
  }
});


http://www.jquerykorea.net/xe/index.php?mid=document&CT=All&document_srl=7608
jQuery.parseXML(data)




o 다음은 Java 로 XML 데이타 다루는 방법

1. FileInputStream 으로 OS 상의 절대경로에서 XML 파일을 읽어서,
2. DocumentBuilder 로 파싱하여 DOM 구조를 만들고,
3. Document 에 담아 NodeList 에 개별적으로 분류


XML 은 요렇게 생겼고.. day 가 반복되는 구조.
<?xml version="1.0" encoding="UTF-8" ?>
<xmlContent>
  <days>
    <day><aa>...</aa><bb>...</bb>...</day>
    <day>...</day>
    <day>...</day>
    <day>...</day>
    ...
    <day>...</day>
  </days>
</xmlContent>


XmlInfo 는 요렇게 생김.. XML 파일이 OS 상의 절대경로에서 어떻게 기술되는지 체크
public class XmlInfo{
  String filePath;   // OS 상에서의 경로
  String fileName; // OS 상에서의 파일명
  ...
}


XML 을 DOM 구조로 메모리에 파싱하여 올리는 Java
public ArrayList getXML(XmlInfo info){

  List                 list    = null;
  FileInputStream fis     = null;
  DocumentBuilder db      = null;
  Document        d       = null;

  try{

    list                  = new ArrayList(); // DOM 에서 필요한 정보만 추출할 목적으로 생성

    fis                   = new FileInputStream(info.getFilePath()+info.getFileName());
    db                    = DocumentBuilderFactory.newInstance().newDocumentBuilder();
    d                     = db.parse(fis,"UTF-8"); // 문자셋에 유의, XML 에 기술된 문자셋으로 세팅

    NodeList      days    = d.getElementsByTagName("day"); // day 는 반복되는 태그 이름
    for(int i=0,s=days.size(); i<s; i++) {
      Map       row         = new HashMap();
      NodeList  daysNL = day.item(i).getChildNodes(); // xmlContent.days.day 태그 하위에 존재하는 태그들 목록
      String    aa        =  daysNL.item(1).getFirstChild().getNodeValue();   //  xmlContent.days.day 태그 하위에 존재하는 태그값
      String    bb        =  daysNL.item(3).getFirstChild().getNodeValue();   // 1, 3, 5, 6, .. 홀수배
      ...
      row.put("aa", aa);
      row.put("bb", bb);
      ...
      list.add(row);
    }

  }catch(Exception e){
    StringBuffer  sbLog = new StringBuffer(); // FileAccess 를 줄이기 위해서 한번에 Write 하는 방식으로 전환, 다른 내용들과 섞이는 일도 방지..?
    sbLog.append("\n");
    sbLog.append("---.getXML()\n");
    sbLog.append("---.Exception:" +e.toString()+    "..\n");
    sbLog.append("---.info     :" +info+            "..\n");
    System.out.println(sbLog);                // println 이기 때문에 맨 뒤에는 sbLog.append("\n"); 불필요.
  }finally{
    if(fis  !=null) try{ fis.close(); }catch(Exception e){}finally{ fis =null; }
  }

  return list; // 사용하는 쪽에서 다 사용한 다음엔 list 에 담긴 Map 정보와 list 등을 모두 clear() 해 주세요..