XML 百分网手机站

实现xml文件解析三种方式

时间:2018-04-18 20:42:16 XML 我要投稿

实现xml文件解析三种方式

  1.sax方式

  复制代码 代码如下:

  /**

  * 使用sax解析

  */

  public class SaxParse{

  /**

  * sax解析器

  */

  private SAXParser parser;

  public SaxParse(){

  try {

  SAXParserFactory f = SAXParserFactory.newInstance();

  parser = f.newSAXParser();

  } catch (ParserConfigurationException e) {

  e.printStackTrace();

  } catch (Exception e) {

  e.printStackTrace();

  }

  }

  public ListdoParse(InputStream is) {

  try {

  XmlHandler h = new XmlHandler();

  parser.parse(is,h);

  return h.getpersons();

  } catch (Exception e) {

  e.printStackTrace();

  }

  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".equals(currEleName)){

  person.name = str ;

  }

  else if("age".equals(currEleName)){

  person.age = Integer.parseInt(str);

  }

  }

  public void endDocument() throws SAXException {

  }

  /**

  * 元素结束

  */

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

  throws SAXException {

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

  persons.add(person);

  }

  //将当前元素置空

  else if(("name".equals(currEleName)) || ("age".equals(currEleName))){

  this.currEleName = "" ;

  }

  }

  /**

  * 文档开始事件

  */

  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".equals(localName)){

  person = new Person();

  person.id = Integer.parseInt(attributes.getValue(0));

  }

  //name元素

  else if("name".equals(localName)){

  this.currEleName = "name" ;

  }

  //name元素

  else if("age".equals(localName)){

  this.currEleName = "age" ;

  }

  }

  public Listgetpersons(){

  return persons ;

  }

  }

  }

  2.dom方式

  复制代码 代码如下:

  /**

  * DOM解析

  */

  public class DomParse{

  //

  private DocumentBuilder builder;

  public DomParse(){

  try {

  DocumentBuilderFactory f = DocumentBuilderFactory.newInstance();

  this.builder = f.newDocumentBuilder();

  } catch (Exception e) {

  e.printStackTrace();

  }

  }

  public ListdoParse(InputStream is) {

  Listpersons = new ArrayList();

  Person person = null ;

  try {

  Document doc = builder.parse(is);

  NodeList list = doc.getElementsByTagName("person");

  Element ele = null ;

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

  ele = (Element) list.item(i);

  person = new Person();

  person.id = Integer.parseInt(ele.getAttribute("id"));

  person.name = getSubElementTextContent(ele,"name");

  person.age = Integer.parseInt(getSubElementTextContent(ele,"age"));

  persons.add(person);

  }

  } catch (Exception e) {

  e.printStackTrace();

  }

  return persons;

  }

  /**

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

  */

  private String getSubElementTextContent(Element ele, String tagName) {

  NodeList list = ele.getElementsByTagName(tagName);

  Element e = (Element) list.item(0);

  //得到中间的文本节点

  return e.getTextContent();

  }

  }

  3.pull方式

  复制代码 代码如下:

  /**

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

  */

  public class PullParse{

  public ListdoParse(InputStream is) {

  Listpersons = null ;

  Person person = null ;

  try {

  XmlPullParser parser = Xml.newPullParser();

  //设置解析数据源

  parser.setInput(is, "utf-8");

  //取得事件的'类型

  int eventType = parser.getEventType();

  String eleName = null ;

  while(eventType != XmlPullParser.END_DOCUMENT){

  switch(eventType){

  //文档开始

  case XmlPullParser.START_DOCUMENT:

  persons = new ArrayList();

  break ;

  //元素开始

  case XmlPullParser.START_TAG:

  eleName = parser.getName();

  if("person".equals(eleName)){

  person = new Person();

  person.id = Integer.parseInt(parser.getAttributeValue(0));

  }

  else if("name".equals(eleName)){

  person.name = parser.nextText();

  }

  else if("age".equals(eleName)){

  person.age = Integer.parseInt(parser.nextText());

  }

  break ;

  //标记结束

  case XmlPullParser.END_TAG:

  eleName = parser.getName();

  if("person".equals(eleName)){

  persons.add(person);

  }

  break ;

  }

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

  eventType = parser.next();

  }

  } catch (Exception e) {

  e.printStackTrace();

  }

  return persons;

  }

  }

【实现xml文件解析三种方式】相关文章:

1.Java读取xml文件的方法

2.Android XML文件中的@、?、@+的意义

3.使用XQEngine来搜索XML文件内容

4.怎么打开xml文件的方法和软件

5.美国留学专家解析美国名校的三种方式录取

6.jQuery解析XML与传统JavaScript方法的差别

7.Java多线程的实现方式

8.IBM认证:XML入门XML简介