Android XML 분석 기술-자체 eoe

13471 단어 android
오늘 은 안 드 로 이 드 에서 Pull 의 XML 분석 기술 을 사용 하여 XML 파일 에 대한 분석 과 생 성 을 계속 공부 합 니 다.내일 은 쉬 고 시간 이 넉넉 하기 때문에 저도 어제 정리 하지 못 한 SAX 해석 기술 을 여기 서 정리 하 겠 습 니 다.        1.SAX 분석 기술       Sax 는 이벤트 구동 의 흐름 식 해석 기술 을 사용 합 니 다.이벤트 구동 의 스 트림 분석 방식 은 파일 의 시작 순서 에서 문서 의 끝 까지 일시 정지 하거나 뒤로 물 러 설 수 없습니다.문서 의 시작 이나 끝,요소 의 시작 이나 끝 등 을 분석 하면 이벤트 가 발생 합 니 다.저 희 는 이벤트 처리 방법 에서 데이터 에 대한 작업 을 완성 합 니 다.이 를 통 해 알 수 있 듯 이,우 리 는 이벤트 인 터 페 이 스 를 실현 하 는 클래스 를 작성 해 야 한다.      3.XML 파일 에 대응 하 는 실체 Book:
package eoe.androidxml;



public class Book {



private int id;

private String name;

private float price;



public Book() {

}



public Book(int id, String name, float price) {

this.id = id;

this.name = name;

this.price = price;

}



public int getId() {

return id;

}



public void setId(int id) {

this.id = id;

}



public String getName() {

return name;

}



public void setName(String name) {

this.name = name;

}



public float getPrice() {

return price;

}



public void setPrice(float price) {

this.price = price;

}



@Override

public String toString() {

return "Book [name=" + name + ", price=" + price + "]";

}

}


4.Sax 분석 XML 의 이벤트 처리 클래스:       Sax 의 이벤트 처리 류 는 반드시 ContentHandler 인 터 페 이 스 를 실현 해 야 하지만,우 리 는 이 예 에서 ContentHandler 인터페이스의 모든 방법 을 사용 할 필요 가 없다.우 리 는 그 중의 세 가지 방법 만 필요 하 다.그래서 Sax 는 우리 에 게 어떠한 조작 도 하지 않 은 ContentHandler 구현 클래스 Default Handler 를 제공 합 니 다.우 리 는 Default Handler 류 를 직접 계승 하고 우리 가 필요 로 하 는 방법 을 다시 쓰 면 된다.
package eoe.androidxml.;



import java.util.ArrayList;

import java.util.List;

import org.xml.sax.Attributes;

import org.xml.sax.SAXException;

import org.xml.sax.helpers.DefaultHandler;

import com.changcheng.androidxml.entity.Book;



public class SaxXmlContentHandler extends DefaultHandler {

private List books;

private Book book;

private String tagName;



public List getBooks() {

return books;



}

/**          。*/



@Override

public void startDocument() throws SAXException {

this.books = new ArrayList();

}



/**         。*/



@Override

public void characters(char[] ch, int start, int length)

throws SAXException {

if (this.tagName != null) {

String data = new String(ch, start, length);

if (this.tagName.equals("name")) {

this.book.setName(data);

} else if (this.tagName.equals("price")) {

this.book.setPrice(Float.parseFloat(data));

}

}

}



/**

*          。

* namespaceURI:       

* localName:       (    )

* qName:      (   )

* atts:       

*/



@Override

public void startElement(String uri, String localName, String qName,

Attributes attributes) throws SAXException {

if (localName.equals("book")) {

book = new Book();

book.setId(Integer.parseInt(attributes.getValue(0)));

}

this.tagName = localName;

}



/**

*           。

* uri:       

* localName:       (    )

* name:      (   )

*/



@Override

public void endElement(String uri, String localName, String qName)

throws SAXException {

if (localName.equals("book")) {

this.books.add(this.book);

}

this.tagName = null;

}

}


5.테스트 Sax 를 작성 하여 XML 의 클래스 를 해석 합 니 다.       프로젝트 를 만 들 때 생 성 된 AndroidXML.java 는 사용 되 지 않 았 습 니 다.우 리 는 안 드 로 이 드 의 유닛 테스트 를 사용 하여 위의 프로그램 을 실행 하기 때 문 입 니 다.       Android 유닛 테스트 클래스 작성:자바 코드:
package eoe.androidxml;



import java.io.InputStream;

import java.io.StringWriter;

import java.util.ArrayList;

import java.util.List;

import com.changcheng.androidxml.entity.Book;

import com.changcheng.androidxml.xml.AndoridSaxXml;

import com.changcheng.androidxml.xml.AndroidPullXML;

import android.test.AndroidTestCase;

import android.util.Log;



public class TestAndroidXML extends AndroidTestCase {

private static final String TAG = "TestAndroidXML";



/**

*   Sax  XML

* @throws Throwable

*/



public void testAndroidSaxReadXML() throws Throwable{

InputStream file = this.getClass().getClassLoader().getResourceAsStream("books.xml");

try {

List books = AndoridSaxXml.readXML(file);

Log.i(TAG, books.toString());

} catch (Exception e) {

Log.e(TAG, e.toString());

}

}

}


6.테스트 실행       outline 패 널 에 있 는 testAndroidSaxReadXML 방법 이나 TestAndroidXML 류 의 testAndroidSaxReadXML 방법 에서 오른쪽 단 추 를 누 르 십시오->Debug As->Android Junit Test.실행 이 끝 난 후 LogCat 패 널 에서 실행 끝 을 봅 니 다.Sax 를 사용 하여 XML 문 서 를 만 드 는 것 에 대해 서 는 정리 하지 않 겠 습 니 다.아래 의 Pull 기술 이 야 말로 우리 가 안 드 로 이 드 개발 을 진행 하 는 중점 이다.        2.Pull 분석 기술        Pull 분석 기술 은 Sax 분석 기술 원리 와 같 지만 Sax 분석 보다 간단 하 며 분석 속도 와 점용 자원 의 차이 가 많 지 않 습 니 다.Android 내부 에서 사용 하 는 XML 해석 기술 은 바로 Pull 입 니 다.Android 공식 추천 개발 자 들 은 Pull 해석 기술 을 사용 합 니 다.Pull 해석 기술 은 제3자 가 개발 한 오픈 소스 기술 로 자바 SE 개발 에 도 활용 할 수 있다.다음은 Pull 분석 기술 로 XML 파일 을 분석 한 다음 Pull 기술 로 XML 파일 을 생 성 합 니 다.       Pull 분석 XML 문서       1.XML 파일       위의 books.xml 을 사용 합 니 다.       2.XML 문서 에 대응 하 는 실체 Book       여전히 위의 북 자바 사용 하기       3.Pull 분석 XML 류 자바 코드:
package eoe.xml;



import java.io.InputStream;

import java.io.Writer;

import java.util.ArrayList;

import java.util.List;

import org.xmlpull.v1.XmlPullParser;

import org.xmlpull.v1.XmlPullParserFactory;

import org.xmlpull.v1.XmlSerializer;

import android.util.Xml;

import com.changcheng.androidxml.entity.Book;



public class AndroidPullXML {

public static List readXML(InputStream inputStream,

String inputEncoding) throws Exception {

//   Pull  

XmlPullParserFactory pullParserFactory = XmlPullParserFactory.newInstance();

XmlPullParser pullParser = pullParserFactory.newPullParser();

//   XML

pullParser.setInput(inputStream, inputEncoding);

//   



int eventType = pullParser.getEventType();

List books = null;

Book book = null;

while (eventType != XmlPullParser.END_DOCUMENT) {

String nodeName = pullParser.getName();

switch (eventType) {

//     



case XmlPullParser.START_DOCUMENT:

books = new ArrayList();

break;

//     

case XmlPullParser.START_TAG:

if ("book".equals(nodeName)) {

book = new Book();

book.setId(Integer.parseInt(pullParser.getAttributeValue(0)));



} else if ("name".equals(nodeName)) {

book.setName(pullParser.nextText());

} else if ("price".equals(nodeName)) {

book.setPrice(Float.parseFloat(pullParser.nextText()));

}

break;

//     



case XmlPullParser.END_TAG:

if ("book".equals(nodeName)) {

books.add(book);

book = null;

}

break;

}

eventType = pullParser.next();

}

return books;

}

}


4.테스트 Pull 분석 XML 류 자바 코드 작성:
/**

*   Pull  XML

* @throws Throwable

*/



public void testAndroidPullReadXML() throws Throwable {

InputStream file = this.getClass().getClassLoader().getResourceAsStream("books.xml");

try {

List books = AndroidPullXML.readXML(file, "UTF-8");

Log.i(TAG, books.toString());

} catch (Exception e) {

Log.e(TAG, e.toString());

}

}


5.테스트 실행        outline 패 널 에 있 는 test AndroidPull ReadXML 방법 이나 Test AndroidXML 류 의 test AndroidPull ReadXML 방법 에서 오른쪽 단 추 를 누 르 십시오->Debug As->Android Junit Test.실행 이 끝 난 후 LogCat 패 널 에서 실행 끝 을 봅 니 다.        Pull XML 문서 생 성        Pull 을 사용 하여 위의 books.xml 문 서 를 생 성 합 니 다.        1.AndroidPullXML 클래스 에 방법 을 추가 합 니 다:자바 코드:
public static void writeXML(Writer writer, List books)



throws Exception {

//   XML   

XmlSerializer writexml = Xml.newSerializer();

writexml.setOutput(writer);



//   XML  

writexml.startDocument("UTF-8", true);

writexml.startTag("", "books");



for (Book book : books) {

// name

writexml.startTag("", "name");

writexml.attribute("", "id", book.getId() + "");



writexml.text(book.getName());

writexml.endTag("", "name");



// price

writexml.startTag("", "price");

writexml.text(book.getPrice() + "");

writexml.endTag("", "price");

}



//writexml.endTag("", "books");

}


2.테스트 Pull 생 성 XML 방법 자바 코드 작성:
/**

*   Pull  XML

* @throws Throwable

*/



public void testAndroidPullWriteXML() throws Throwable {

//       。(         ,             。)

StringWriter writer = new StringWriter();

//      



List books = new ArrayList();

books.add(new Book(1, "C", 89));

books.add(new Book(1, "C++", 100));

books.add(new Book(1, "Java", 87));

books.add(new Book(1, "JavaEE", 95));



//   XML

AndroidPullXML.writeXML(writer, books);



//     

Log.i(TAG, books.toString());

}


3.테스트 실행        outline 패 널 에 있 는 test AndroidPull Write XML 방법 이나 Test AndroidXML 류 의 test AndroidPull Write XML 방법 에서 오른쪽 단 추 를 누 르 십시오->Debug As->Android Junit Test.실행 이 끝 난 후 LogCat 패 널 에서 실행 끝 을 봅 니 다.
6.테스트 실행        outline 패 널 에 있 는 testAndroidSaxReadXML 방법 이나 TestAndroidXML 류 의 testAndroidSaxReadXML 방법 에서 오른쪽 단 추 를 누 르 십시오->Debug As->Android Junit Test.실행 이 끝 난 후 LogCat 패 널 에서 실행 끝 을 봅 니 다.        Sax 를 사용 하여 XML 문 서 를 만 드 는 것 에 대해 서 는 정리 하지 않 겠 습 니 다.아래 의 Pull 기술 이 야 말로 우리 가 안 드 로 이 드 개발 을 진행 하 는 중점 이다.        2.Pull 분석 기술        Pull 분석 기술 은 Sax 분석 기술 원리 와 같 지만 Sax 분석 보다 간단 하 며 분석 속도 와 점용 자원 의 차이 가 많 지 않 습 니 다.Android 내부 에서 사용 하 는 XML 해석 기술 은 바로 Pull 입 니 다.Android 공식 추천 개발 자 들 은 Pull 해석 기술 을 사용 합 니 다.Pull 해석 기술 은 제3자 가 개발 한 오픈 소스 기술 로 자바 SE 개발 에 도 활용 할 수 있다.다음은 Pull 분석 기술 로 XML 파일 을 분석 한 다음 Pull 기술 로 XML 파일 을 생 성 합 니 다.        Pull 분석 XML 문서       1.XML 파일       위의 books.xml 을 사용 합 니 다.       2.XML 문서 에 대응 하 는 실체 Book       여전히 위의 북 자바 사용 하기       3.Pull 분석 XML 류 자바 코드:
package eoe.xml;



import java.io.InputStream;

import java.io.Writer;

import java.util.ArrayList;

import java.util.List;

import org.xmlpull.v1.XmlPullParser;

import org.xmlpull.v1.XmlPullParserFactory;

import org.xmlpull.v1.XmlSerializer;

import android.util.Xml;

import com.changcheng.androidxml.entity.Book;



public class AndroidPullXML {

public static List readXML(InputStream inputStream,

String inputEncoding) throws Exception {

//   Pull  

XmlPullParserFactory pullParserFactory = XmlPullParserFactory.newInstance();



XmlPullParser pullParser = pullParserFactory.newPullParser();



//   XML

pullParser.setInput(inputStream, inputEncoding);



//   

int eventType = pullParser.getEventType();

List books = null;

Book book = null;



while (eventType != XmlPullParser.END_DOCUMENT) {

String nodeName = pullParser.getName();



switch (eventType) {

//     

case XmlPullParser.START_DOCUMENT:

books = new ArrayList();

break;



//     



case XmlPullParser.START_TAG:



if ("book".equals(nodeName)) {

book = new Book();

book.setId(Integer.parseInt(pullParser.getAttributeValue(0)));

} else if ("name".equals(nodeName)) {

book.setName(pullParser.nextText());

} else if ("price".equals(nodeName)) {

book.setPrice(Float.parseFloat(pullParser.nextText()));

}

break;



//     

case XmlPullParser.END_TAG:

if ("book".equals(nodeName)) {

books.add(book);

book = null;

}

break;

}

eventType = pullParser.next();

}

return books;

}



}


4.테스트 Pull 해석 XML 클래스 작성       sax 테스트 클래스 Test AndroidXML 에 테스트 방법 추가:자바 코드:
/**

*   Pull  XML

* @throws Throwable

*/



public void testAndroidPullReadXML() throws Throwable {

InputStream file = this.getClass().getClassLoader().getResourceAsStream("books.xml");

try {



List books = AndroidPullXML.readXML(file, "UTF-8");

Log.i(TAG, books.toString());

} catch (Exception e) {

Log.e(TAG, e.toString());

}



}


5.테스트 실행       outline 패 널 에 있 는 test AndroidPull ReadXML 방법 이나 Test AndroidXML 류 의 test AndroidPull ReadXML 방법 에서 오른쪽 단 추 를 누 르 십시오->Debug As->Android Junit Test.실행 이 끝 난 후 LogCat 패 널 에서 실행 끝 을 봅 니 다.       Pull XML 문서 생 성       Pull 을 사용 하여 위의 books.xml 문 서 를 생 성 합 니 다.       1.AndroidPullXML 클래스 에 방법 을 추가 합 니 다:자바 코드:
public static void writeXML(Writer writer, List books)



throws Exception {

//   XML   

XmlSerializer writexml = Xml.newSerializer();

writexml.setOutput(writer);



//   XML  

writexml.startDocument("UTF-8", true);

writexml.startTag("", "books");



for (Book book : books) {



// name

writexml.startTag("", "name");

writexml.attribute("", "id", book.getId() + "");

writexml.text(book.getName());

writexml.endTag("", "name");



// price

writexml.startTag("", "price");

writexml.text(book.getPrice() + "");

writexml.endTag("", "price");

}

writexml.endTag("", "books");



}


2.테스트 Pull 생 성 XML 방법 작성        sax 테스트 클래스 Test AndroidXML 에 테스트 방법 추가:자바 코드:
/**

*   Pull  XML

* @throws Throwable

*/



public void testAndroidPullWriteXML() throws Throwable {

//       。(         ,             。)



StringWriter writer = new StringWriter();

//      



List books = new ArrayList();

books.add(new Book(1, "C", 89));

books.add(new Book(1, "C++", 100));

books.add(new Book(1, "Java", 87));

books.add(new Book(1, "JavaEE", 95));



//   XML

AndroidPullXML.writeXML(writer, books);



//     

Log.i(TAG, books.toString());

}


3.테스트 실행         outline 패 널 에 있 는 test AndroidPull Write XML 방법 이나 Test AndroidXML 류 의 test AndroidPull Write XML 방법 에서 오른쪽 단 추 를 누 르 십시오->Debug As->Android Junit Test.실행 이 끝 난 후 LogCat 패 널 에서 실행 끝 을 봅 니 다.

좋은 웹페이지 즐겨찾기