자바 에서 XML 분석

XML 은 프로그램의 개발 에서 의 지위 가 점점 중요 해 지고 있 습 니 다.우 리 는 항상 프로 그래 밍 에서 XML 문 서 를 해석 해 야 합 니 다.자바 에서 XML 문 서 를 해석 하 는 데 는 여러 가지 방식 이 있 고 모든 방식 이 특징 이 있 습 니 다.XML 문 서 를 다른 해석 방식 으로 해석 하여 보 여 드 리 겠 습 니 다.
우선 DOM(Document Object Model 문서 개체 모델)방식 을 사용한다.이 방식 으로 XML 문 서 를 해석 할 때 XML 문 서 를 전체적으로 불 러 와 문서 대상 트 리 를 만 듭 니 다.문서 의 모든 내용 은 트 리 의 노드 를 형성 합 니 다(요소,속성,텍스트).이렇게 하면 우 리 는 무 작위 로 읽 는 방식 으로 읽 을 수 있다.장점 은 우리 가 문 서 를 해석 할 때 임의의 순서 로 내용 을 조작 할 수 있 고 조작 이 유연 하 다 는 것 이다.하지만 문 서 는 전체적으로 불 러 와 야 합 니 다.그래서 문서 의 내용 이 비교적 클 때 우 리 는 그 중의 일부분 만 읽 어야 한다.분명히 문제 가 있다.따라서 우리 가 읽 은 xml 문서 가 시간 에 비해 이 방식 을 사용 할 수 있 습 니 다.이 방식 의 프로 그래 밍 도 상대 적 으로 간단 하 다.Ajax 작업 XML 과 Html 은 일반적으로 이 방식 을 사용 합 니 다)
만약 에 우리 가 다음 과 같은 xml 문서 가 존재 한다 고 가정 하면 이름 은 student.xml 입 니 다.우 리 는 DOM 방식 으로 문서 의 내용 을 분석 합 니 다.
<?xml version="1.0" encoding="UTF-8"?>
<students>
 <student>
  <name>Tom</name>
  <age>20</age>
  <skill>java</skill>
 </student>
 <student>
  <name>Mike</name>
  <age>23</age>
  <skill>.net</skill>
 </student>
</students>

 DOM 으로 상기 문 서 를 해석 하 는 자바 코드 는 다음 과 같 습 니 다.
package com.frank.xml;

import java.io.File;
import java.io.IOException;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;

import org.w3c.dom.Document;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;

public class DOMSample {

 /**
  * @param args
  * @throws IOException
  * @throws SAXException
  */
 public static void main(String[] args){
  File file=new File("students.xml");
  DocumentBuilderFactory fac=DocumentBuilderFactory.newInstance();
  DocumentBuilder documentBuilder;
  try {
   documentBuilder = fac.newDocumentBuilder();
   Document document=documentBuilder.parse(file);
   NodeList nodeList=document.getElementsByTagName("student");
   for(int i=0;i<nodeList.getLength();i++){
    //System.out.print(document.getElementsByTagName("name").item(i).getFirstChild().getNodeValue());
    //System.out.print("===");
    //System.out.print(document.getElementsByTagName("age").item(i).getFirstChild().getNodeValue());
    //System.out.print("===");
    //System.out.print(document.getElementsByTagName("skill").item(i).getFirstChild().getNodeValue());
    System.out.print(nodeList.item(i).getChildNodes().item(1).getFirstChild().getNodeValue());
    System.out.print("===");
    System.out.print(nodeList.item(i).getChildNodes().item(3).getFirstChild().getNodeValue());
    System.out.print("===");
    System.out.print(nodeList.item(i).getChildNodes().item(5).getFirstChild().getNodeValue());
    System.out.println("");
   }
  } catch (Exception e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
 }
}

 출력 결 과 는 다음 과 같 습 니 다.
Tom===20===java Mike===23===.net
주석 부분 을 주의 하 십시오.문 서 를 해석 하 는 과정 도 마 칠 수 있 습 니 다.왜 실현 할 때 하위 노드 를 얻 을 때 사용 하 는 번 호 는 1,3,5 입 니까?모든 student 이 가지 고 있 는 하위 절 포 인 트 는 3 이 아니 라 7 이기 때문에 텍스트 와 student 이 포함 하 는 텍스트(여 기 는 비어 있 습 니 다)는 같은 하위 노드 입 니 다.
SAX 로 XML 분석
SAX 로 XML 을 해석 하 는 것 은 순서 적 이다.XML 문 서 를 위 에서 아래로 해석 하 는 것 입 니 다.사건 구동 메커니즘 을 채택 하 다.한 노드 를 만 났 을 때 바로 처리 합 니 다.문서 가 전체적으로 불 러 올 때 까지 기다 리 는 것 이 아 닙 니 다.SAX 분석 방식 은 제 공 된 몇 가지 방법 을 이용 합 니 다.문서 의 일부분 을 만 났 을 때 리 셋 체 제 를 이용 하여 해당 하 는 방법 으로 적당 한 처 리 를 한다.예 를 들 어 SAX 에 조작 노드 가 존재 하 는 방법:startElement 와 endElement
시작 노드 를 만 났 을 때 startElement 를 호출 하고 끝 노드 를 만 났 을 때 endElement 를 호출 합 니 다.우 리 는 이 두 가지 방법 에서 구체 적 인 처리 과정 을 써 서 XML 문서 에 대한 해석 을 실현 하고 내용 을 읽 을 때 제공 하 는 다른 방법 characters 를 이용 할 수 있다.
또한 문 서 를 분석 할 때 호출 되 는 startDocument 와 문서 해석 이 끝 날 때 endDocument 를 호출 합 니 다.
SAX 해석 을 사용 하여 문 서 를 전체적으로 불 러 오지 않 기 때문에 비교적 큰 문 서 를 해석 할 때 SAX 방식 을 사용 하 는 것 이 좋 습 니 다.그리고 분석 속 도 는 DOM 보다 좋 지만 조작 과정 인 코딩 은 번 거 롭 습 니 다.
마찬가지 로 우 리 는 아까 의 students.xml 를 분석 하고 SAX 를 이용 하여 다음 과 같이 할 수 있 습 니 다.
package com.frank.xml;

import java.util.Stack;

import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;

import org.xml.sax.Attributes;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

public class SAXSample extends DefaultHandler {
 Stack tags = new Stack();
 /**
  * @param args
  */
 public static void main(String[] args) {
  try{
   SAXParserFactory factory=SAXParserFactory.newInstance();
   SAXParser sAXParser=factory.newSAXParser();
   SAXSample sAXSample=new SAXSample();
   sAXParser.parse(new InputSource("students.xml"), sAXSample);
  }catch(Exception ex){
   ex.printStackTrace();
  }

 }

 @Override
 public void characters(char ch[], int start, int length)
   throws SAXException {
  // TODO Auto-generated method stub
  String tag = (String) tags.peek();
  if(tag.equals("name")){
   System.out.println("name="+new String(ch, start, length));
  }
  if(tag.equals("age")){
   System.out.println("age="+new String(ch, start, length));
  }
  if(tag.equals("skill")){
   System.out.println("skill="+new String(ch,start,length));
  }
 }

 @Override
 public void endElement(String arg0, String arg1, String arg2)
   throws SAXException {
  // TODO Auto-generated method stub
  tags.pop();
 }

 @Override
 public void startElement(String uri,String localName,String qName,Attributes attrs)  throws SAXException {
  // TODO Auto-generated method stub
  tags.push(qName);
 }
}

 실행 결 과 는 다음 과 같 습 니 다.
name=Tom age=20 skill=java name=Mike age=23 skill=.net

좋은 웹페이지 즐겨찾기