实现xml文件解析三种方式

  方式

实现xml文件解析三种方式

复制代码 代码如下:

/**

* 使用sax解析

*/

public class SaxParse{

/**

* sax解析器

*/

private SAXParser parser;

public SaxParse(){

try {

SAXParserFactory f = nstance();

parser = AXParser();

} catch (ParserConfigurationException e) {

tStackTrace();

} catch (Exception e) {

tStackTrace();

}

}

public ListdoParse(InputStream is) {

try {

XmlHandler h = new XmlHandler();

e(is,h);

return ersons();

} catch (Exception e) {

tStackTrace();

}

return null;

}

/**

* 处理器

*/

class XmlHandler extends DefaultHandler{

Listpersons = null ;

Person person = null ;

//当前元素名称

private String currEleName;

/**

* 文本节点触发该方法

*/

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

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

//name

if("name"ls(currEleName)){

= str ;

}

else if("age"ls(currEleName)){

= eInt(str);

}

}

public void endDocument() throws SAXException {

}

/**

* 元素结束

*/

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

throws SAXException {

if("person"ls(localName)){

(person);

}

//将当前元素置空

else if(("name"ls(currEleName)) || ("age"ls(currEleName))){

EleName = "" ;

}

}

/**

* 文档开始事件

*/

public void startDocument() throws SAXException {

persons = new ArrayList();

}

/**

* 元素开始事件

* localName:本地名

* uri:名字空间

* qName:限定名,前缀 + 本地名

*/

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

Attributes attributes) throws SAXException {

//实例化person对象

if("person"ls(localName)){

person = new Person();

= eInt(alue(0));

}

//name元素

else if("name"ls(localName)){

EleName = "name" ;

}

//name元素

else if("age"ls(localName)){

EleName = "age" ;

}

}

public Listgetpersons(){

return persons ;

}

}

}

  方式

复制代码 代码如下:

/**

* DOM解析

*/

public class DomParse{

//

private DocumentBuilder builder;

public DomParse(){

try {

DocumentBuilderFactory f = nstance();

der = ocumentBuilder();

} catch (Exception e) {

tStackTrace();

}

}

public ListdoParse(InputStream is) {

Listpersons = new ArrayList();

Person person = null ;

try {

Document doc = e(is);

NodeList list = lementsByTagName("person");

Element ele = null ;

for(int i = 0 ; i < ength() ; i ++){

ele = (Element) (i);

person = new Person();

= eInt(ttribute("id"));

= getSubElementTextContent(ele,"name");

= eInt(getSubElementTextContent(ele,"age"));

(person);

}

} catch (Exception e) {

tStackTrace();

}

return persons;

}

/**

* 得到指定的资源中中间的文本内容

*/

private String getSubElementTextContent(Element ele, String tagName) {

NodeList list = lementsByTagName(tagName);

Element e = (Element) (0);

//得到中间的文本节点

return extContent();

}

}

  方式

复制代码 代码如下:

/**

* pull解析,拉模式,可以手动控制下一个事件是否触发.

*/

public class PullParse{

public ListdoParse(InputStream is) {

Listpersons = null ;

Person person = null ;

try {

XmlPullParser parser = ullParser();

//设置解析数据源

nput(is, "utf-8");

//取得事件的'类型

int eventType = ventType();

String eleName = null ;

while(eventType != _DOCUMENT){

switch(eventType){

//文档开始

case T_DOCUMENT:

persons = new ArrayList();

break ;

//元素开始

case T_TAG:

eleName = ame();

if("person"ls(eleName)){

person = new Person();

= eInt(ttributeValue(0));

}

else if("name"ls(eleName)){

= Text();

}

else if("age"ls(eleName)){

= eInt(Text());

}

break ;

//标记结束

case _TAG:

eleName = ame();

if("person"ls(eleName)){

(person);

}

break ;

}

//手动激活下个事件的触发

eventType = ();

}

} catch (Exception e) {

tStackTrace();

}

return persons;

}

}