자바 에서 sax 분석 xml

1. 자바 에서 SAX 해석 은 xml 파일 의 순서에 따라 한 걸음 한 걸음 해석 합 니 다. 이때 xml 파일 의 노드 는 두 가지 로 나 뉘 는데 하 나 는 Element Node 이 고 하 나 는 TextNode 입 니 다.
예 를 들 어 다음 xml 코드:

<?xml version="1.0" encoding="utf-8"?>
<books>
  <book id="12">
    <name>hello world</name>
    <price>12</price>
    </book>
  <book id="14">
     <name>yes or no</name>
     <price>14</price>
  </book>
</books>


그 중에서 < books >, < book > 이라는 노드 는 바로 Element Node 에 속 하고 hello world, yes or no 는 TextNode 에 속 합 니 다.
2. xml 파일 은 Sax 해석 기 에 불 러 옵 니 다. Sax 해석 은 xml 파일 의 순서에 따라 해석 되 기 때문에 을 읽 을 때 startDocument () 방법 을 호출 합 니 다. < books > 를 읽 을 때 Element Node 이기 때문에 startElement (String uri, String localName, String qName, Attributes attributes) 방법 을 호출 합 니 다. 두 번 째 매개 변 수 는 노드 의 이름 입 니 다. 주의: 환경 이 다 르 기 때문에 두 번 째 매개 변 수 는 비어 있 을 수도 있 습 니 다.그래서 세 번 째 파 라 메 터 를 사용 할 수 있 습 니 다. 따라서 분석 하기 전에 어떤 파 라 메 터 를 사용 할 수 있 는 지, 네 번 째 파 라 메 터 는 이 노드 의 속성 입 니 다.여기 서 우 리 는 이 노드 가 필요 하지 않 습 니 다. 따라서 < book > 이 노드 부터 그림 의 1 의 위 치 를 읽 을 때 startElement (...) 방법 을 호출 합 니 다. 하나의 속성 id 만 있 기 때문에 attributes. getValue (0) 를 통 해 얻 을 수 있 습 니 다. 그리고 그림 에 2 를 표시 한 곳 에서 characters (char [] ch, int start, int length) 방법 을 호출 합 니 다. 그곳 이 공백 이 라 고 생각 하지 마 세 요.Sax 해상도 기 는 그렇게 생각 하지 않 습 니 다. Sax 해상도 기 는 그것 을 TextNode 라 고 생각 합 니 다.그러나 이 공백 은 우리 가 원 하 는 데이터 가 아 닙 니 다. 우 리 는 < name > 노드 의 텍스트 정 보 를 원 합 니 다.이것 은 이전 노드 의 이름 을 기록 하 는 TAG 를 정의 해 야 합 니 다. characters (....) 방법 에서 현재 노드 가 name 인지 아 닌 지 를 판단 하고 값 을 다시 추출 해 야 hello World 를 찾 을 수 있 습 니 다.코드 참조: SaxParseService. java

import java.io.InputStream;   
import java.util.ArrayList;   
import java.util.List;   
  
import javax.xml.parsers.SAXParser;   
import javax.xml.parsers.SAXParserFactory;   
  
import org.xml.sax.Attributes;   
import org.xml.sax.SAXException;   
import org.xml.sax.helpers.DefaultHandler;   
  
import com.xtlh.cn.entity.Book;   
  
public class SaxParseService extends DefaultHandler{   
    private List<Book> books = null;   
    private Book book = null;   
    private String preTag = null;//作用是记录解析时的上一个节点名称   
       
    public List<Book> getBooks(InputStream xmlStream) throws Exception{   
        SAXParserFactory factory = SAXParserFactory.newInstance();   
        SAXParser parser = factory.newSAXParser();   
        SaxParseService handler = new SaxParseService();   
        parser.parse(xmlStream, handler);   
        return handler.getBooks();   
    }   
       
    public List<Book> getBooks(){   
        return books;   
    }   
       
    @Override  
    public void startDocument() throws SAXException {   
        books = new ArrayList<Book>();   
    }   
  
    @Override  
    public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {   
        if("book".equals(qName)){   
            book = new Book();   
            book.setId(Integer.parseInt(attributes.getValue(0)));   
        }   
        preTag = qName;//将正在解析的节点名称赋给preTag   
    }   
  
    @Override  
    public void endElement(String uri, String localName, String qName)   
            throws SAXException {   
        if("book".equals(qName)){   
            books.add(book);   
            book = null;   
        }   
        preTag = null;/**当解析结束时置为空。这里很重要,例如,当图中画3的位置结束后,会调用这个方法  
        ,如果这里不把preTag置为null,根据startElement(....)方法,preTag的值还是book,当文档顺序读到图  
        中标记4的位置时,会执行characters(char[] ch, int start, int length)这个方法,而characters(....)方  
        法判断preTag!=null,会执行if判断的代码,这样就会把空值赋值给book,这不是我们想要的。*/  
    }   
       
    @Override  
    public void characters(char[] ch, int start, int length) throws SAXException {   
        if(preTag!=null){   
            String content = new String(ch,start,length);   
            if("name".equals(preTag)){   
                book.setName(content);   
            }else if("price".equals(preTag)){   
                book.setPrice(Float.parseFloat(content));   
            }   
        }   
    }   
       
}  



그 중에서 북 자바 코드 는 다음 과 같 습 니 다. (많이 절약 되 었 습 니 다)

public class Book {   
    private int id;   
    private String name;   
    private float price;   

//setter and getter....

유닛 테스트 는 다음 과 같 습 니 다: ParseTest. 자바

import java.io.InputStream;   
import java.util.List;   
  
import junit.framework.TestCase;   
  
import com.xtlh.cn.demo.DomParseService;   
import com.xtlh.cn.demo.SaxParseService;   
import com.xtlh.cn.entity.Book;   
  
public class ParseTest extends TestCase{   
  
    public void testSAX() throws Throwable{   
        SaxParseService sax = new SaxParseService();   
        InputStream input = this.getClass().getClassLoader().getResourceAsStream("book.xml");   
        List<Book> books = sax.getBooks(input);   
        for(Book book : books){   
            System.out.println(book.toString());   
        }   
    }   
}  



코드 자 료 는 자바 아이 에서 얻 을 수 있 습 니 다. 표절 이 아 닙 니 다. 이 글 은 학습 에 만 사 용 됩 니 다.

좋은 웹페이지 즐겨찾기