자바 에서 sax 분석 xml
예 를 들 어 다음 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());
}
}
}
코드 자 료 는 자바 아이 에서 얻 을 수 있 습 니 다. 표절 이 아 닙 니 다. 이 글 은 학습 에 만 사 용 됩 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Is Eclipse IDE dying?In 2014 the Eclipse IDE is the leading development environment for Java with a market share of approximately 65%. but ac...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.