您的位置:首页 > 其它

Dom与Pull方式解析XML文件

2013-05-26 17:05 387 查看
1. Dom方式解析

public class DomStudentService

{

public static List<Student> readStudentXML(InputStream input)

{

try

{

List<Student> list = new ArrayList<Student>();

Student stu = null;

DocumentBuilderFactory domBuilderFactory = DocumentBuilderFactory.newInstance();

DocumentBuilder domBuilder = domBuilderFactory.newDocumentBuilder();

Document dom = domBuilder.parse(input);

Element root = dom.getDocumentElement();

NodeList stuList = root.getElementsByTagName("Student");

for(int i = 0; i < stuList.getLength(); i++)

{

stu = new Student();

Element stuNode = (Element)stuList.item(i); /* Element继承自Node,并不是每个Node都是Element,/n/t也是Node */

/*set id*/

stu.setId(stuNode.getAttribute("id")); /*获取属性值*/

NodeList stuChilds = stuNode.getChildNodes();

for(int j = 0; j < stuChilds.getLength(); j++)

{

if(stuChilds.item(j).getNodeType() != Node.ELEMENT_NODE) /* 判断Node类型是否为Element */

{

continue ;

}

Node childElement = stuChilds.item(j);

/*set name*/

if("name".equals(childElement.getNodeName()))

{

stu.setName(childElement.getFirstChild().getNodeValue());
/*获取标签内的文本*/

}

/*set age*/

else if("age".equals(childElement.getNodeName()))

{

stu.setAge(Integer.parseInt(childElement.getFirstChild().getNodeValue()));

}

}

list.add(stu);

}

return list;

}

catch(Exception e)

{

e.printStackTrace();

}

return null;

}

}

2.Pull方式解析

pull方式基本与SAX方式一致,事件是由自己触发,性能比较高,与SAX差不多。

public static List<Student> readStudentXml(InputStream input)

{

List<Student> list = null;

Student stu = null;

try

{

XmlPullParserFactory pullParserFactory = XmlPullParserFactory.newInstance();

XmlPullParser pullParser = pullParserFactory.newPullParser();

pullParser.setInput(input, "UTF-8");

int type = pullParser.getEventType(); /*第一次获取事件*/

while(type != XmlPullParser.END_DOCUMENT)
/*遇到文档结束事件,循环终止*/

{

switch(type)

{

case XmlPullParser.START_DOCUMENT: /*文档开始事件*/

list = new ArrayList<Student>();

break;

case XmlPullParser.START_TAG:
/*标签开始事件*/

if("Student".equals(pullParser.getName()))

{

stu = new Student();

stu.setId(pullParser.getAttributeValue(null, "id"));

}

else if("name".equals(pullParser.getName()))

{

if(stu == null)

{

break;

}

stu.setName(pullParser.nextText());

}

else if("age".equals(pullParser.getName()))

{

if(stu == null)

{

break;

}

stu.setAge(Integer.parseInt(pullParser.nextText()));

}

break;

case XmlPullParser.END_TAG:
/*标签结束事件*/

if("Student".equals(pullParser.getName()))

{

list.add(stu);

}

break;

default:

break;

}

type = pullParser.next(); /*迭代获取事件*/

}

return list;

}

catch(Exception e)

{

e.printStackTrace();

}

return null;

}

3. Pull方式写XML

public static void WriteStudentXml(List<Student> list, OutputStream output)

{

try

{

XmlSerializer xmlSeri = Xml.newSerializer();
/*创建XmlSerilizer*/

xmlSeri.setOutput(output, "UTF-8");

xmlSeri.startDocument("UTF-8", null);
/*开始文档*/

xmlSeri.startTag(null, "Students"); /*开始标签*/

for(Student stu : list)

{

xmlSeri.startTag(null, "Student");

xmlSeri.attribute(null, "id", stu.getId()); /*写属性*/

xmlSeri.startTag(null, "name");

xmlSeri.text(stu.getName());

xmlSeri.endTag(null, "name");

xmlSeri.startTag(null, "age");

xmlSeri.text(((Integer)stu.getAge()).toString());

xmlSeri.endTag(null, "age");

xmlSeri.endTag(null, "Student");

}

xmlSeri.endTag(null, "Students"); /*结束标签*/

xmlSeri.endDocument();
/*结束文档*/

output.close();

}

catch(Exception e)

{

e.printStackTrace();

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: