现在的位置: 首页 > 综合 > 正文

android中XML解析生成

2013年03月01日 ⁄ 综合 ⁄ 共 3889字 ⁄ 字号 评论关闭

1.SAX解析原理::

        SAX式一个接卸速度快并且占用内存少的XML解析器,SAX解析XML文件采用的是事件驱动,也就是说不需要解析完整个文件,在按内容顺序解析文件过程中,SAX会判断当前独到的字符是否符合XML语法中的某个部分,如果符合就会触发事件。。就是在读取文件过程中读完一个元素节点(每个元素的节点)或者是文本节点(就是元素中间的内容,包括上一个节点结束到下一个节点开始,那一段空白页是文本节点)后,触发一个事件。

<?xml version = "1.0" encoding="UTF-8"?>--------startDocument()开始头部

<person>  --------------->startElement()开始元素语法

(这里文本节点,characters()方法) <name>jj</name>

                                                              <age>30</age>

</person>----------------->endElement()结束元素语法   文件结束后触发endDocument()

 

 public List<Person> getPersons(InputStream inStream) throws Throwable{
  SAXParserFactory factory = SAXParserFactory.newInstance();  // SAX工厂得到实例
  SAXParser parser = factory.newSAXParser();//得到解析器
  parser.parse(inStream, handler);//第二参数中,是DefaleHandler 是帮助类,实现了contentHandler接口,继承此类实现其中SAX事件方法。
   }

2.DOM解析:

/**
 * 采用DOM解析XML内容
 */
public class DOMPersonService {

 public static List<Person> getPersons(InputStream inStream) throws Throwable{
  List<Person> persons = new ArrayList<Person>();
  DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
  DocumentBuilder builder = factory.newDocumentBuilder();
  Document documnet = builder.parse(inStream);
  Element root = documnet.getDocumentElement();
  NodeList personNodes = root.getElementsByTagName("person");
  for(int i=0 ; i < personNodes.getLength(); i++){
   Person person = new Person();
   Element personElement = (Element)personNodes.item(i);
   person.setId(new Integer(personElement.getAttribute("id")));
   NodeList personChilds = personElement.getChildNodes();
   for(int y=0 ; y < personChilds.getLength(); y++){
    if(personChilds.item(y).getNodeType()==Node.ELEMENT_NODE){//判断当前节点是否是元素类型节点
     Element childElement = (Element)personChilds.item(y);
     if("name".equals(childElement.getNodeName())){
      person.setName(childElement.getFirstChild().getNodeValue());
     }else if("age".equals(childElement.getNodeName())){
      person.setAge(new Short(childElement.getFirstChild().getNodeValue()));
     }
    }
   }
   persons.add(person);
  }
  return persons;
 }
}

 

3.pull解析:

 public static List<Person> getPersons(InputStream inStream) throws Throwable{
  List<Person> persons = null;
  Person person = null;
  XmlPullParser parser = Xml.newPullParser();
  parser.setInput(inStream, "UTF-8");
  int eventType = parser.getEventType();//产生第一个事件
  while(eventType!=XmlPullParser.END_DOCUMENT){//只要不是文档结束事件
   switch (eventType) {
   case XmlPullParser.START_DOCUMENT:
    persons = new ArrayList<Person>();
    break;
 
   case XmlPullParser.START_TAG:
    String name = parser.getName();//获取解析器当前指向的元素的名称
    if("person".equals(name)){
     person = new Person();
     person.setId(new Integer(parser.getAttributeValue(0)));
    }
    if(person!=null){
     if("name".equals(name)){
      person.setName(parser.nextText());//获取解析器当前指向元素的下一个文本节点的值
     }
     if("age".equals(name)){
      person.setAge(new Short(parser.nextText()));
     }
    }
    break;
    
   case XmlPullParser.END_TAG:
    if("person".equals(parser.getName())){
     persons.add(person);
     person = null;
    }
    break;
   }
   eventType = parser.next();
  }
  return persons;
 }
}

 

 

 

二。xml文件生成方式

1.使用StringBuilder拼接:注意有特殊字符的时候要转义

StringBuilder buidler = new StringBuilder();

buidler.append(<person>);

......

FileOutPutStream stream=new  FileOutPutStream (file);

......

 

2.采用pull生成xml

 public static void save(List<Person> persons, Writer writer) throws Throwable{
  XmlSerializer serializer = Xml.newSerializer();
  serializer.setOutput(writer);
  serializer.startDocument("UTF-8", true);
  
  serializer.startTag(null, "persons");
  for(Person person : persons){
   serializer.startTag(null, "person");
   serializer.attribute(null, "id", person.getId().toString());
   
   serializer.startTag(null, "name");
   serializer.text(person.getName());
   serializer.endTag(null, "name");
   
   serializer.startTag(null, "age");
   serializer.text(person.getAge().toString());
   serializer.endTag(null, "age");
   
   serializer.endTag(null, "person");
  }
  serializer.endTag(null, "persons");  
  serializer.endDocument();
  writer.flush();
  writer.close();
 }

 

抱歉!评论已关闭.