Maison > Article > développement back-end > Résumé de trois méthodes d'exploitation de XML sous Android
Sous Android, il existe généralement plusieurs manières d'exploiter les fichiers XML : opération SAX, opération Pull, opération DOM, etc. Parmi elles, la méthode DOM est peut-être la plus connue de tous, et elle est également conforme à la norme W3C
XML est un format d'échange de données reconnu par l'industrie et est disponible sur. diverses plates-formes et langages largement utilisés et mis en œuvre. Son type standard, sa fiabilité, sa sécurité... Cela ne fait aucun doute. Sur la plateforme Android, si nous souhaitons mettre en œuvre le stockage et l'échange de données, nous utilisons souvent le format de données XML et les fichiers XML.
Conseils : Les données stockées dans Android incluent généralement les types suivants : SharedPreferences (paramétrage), fichiers XML, base de données sqllite, réseau, ContentProvider (fournisseur de contenu), etc.
Sous Android, il existe généralement plusieurs manières d'exploiter les fichiers XML : opération SAX, opération Pull, opération DOM, etc. Parmi elles, la méthode DOM est peut-être la plus familière à tous, et elle est également conforme aux normes du W3C.
1)
Dans la plateforme Java, il existe d'excellents packages open source tels que DOM4J, ce qui facilite grandement l'utilisation du standard DOM par tout le monde . Manipuler les fichiers XML. En JavaScript, les différents moteurs d'analyse des navigateurs ont des analyses et des opérations légèrement différentes sur le DOM (mais ce n'est pas l'objet de ce chapitre). La méthode DOM a aussi ses défauts. Habituellement, le fichier XML est chargé une fois puis analysé à l'aide de l'api du DOM. Cela consomme beaucoup de mémoire et a un certain impact sur les performances. Même si la configuration de nos téléphones Android est constamment améliorée, en termes de mémoire, elle n'est toujours pas en mesure de rivaliser avec les PC traditionnels. Par conséquent, sur Android, il n'est pas recommandé d'utiliser DOM pour analyser et manipuler XML.
Copier le code Le code est le suivant :
package cn.itcast.service; import java.io.InputStream;import java.util.ArrayList;import java.util.List; import javax.xml.parsers.DocumentBuilder;import javax.xml.parsers.DocumentBuilderFactory; import org.w3c.dom.Document;import org.w3c.dom.Element;import org.w3c.dom.Node;import org.w3c.dom.NodeList; import cn.itcast.model.Person; public class DomPersonService { public List<Person> getPersons(InputStream stream) throws Throwable { List<Person> list =new ArrayList<Person>(); DocumentBuilderFactory factory =DocumentBuilderFactory.newInstance(); DocumentBuilder builder =factory.newDocumentBuilder(); Document dom = builder.parse(stream);//解析完成,并以dom树的方式存放在内存中。比较消耗性能 //开始使用dom的api去解析 Element root = dom.getDocumentElement();//根元素 NodeList personNodes = root.getElementsByTagName("person");//返回所有的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")));//将person元素节点的属性节点id的值,赋给person对象 NodeList personChildrenNodes =personElement.getChildNodes();//获取person节点的所有子节点 //遍历所有子节点 for(int j=0;j<personChildrenNodes.getLength();j++) { //判断子节点是否是元素节点(如果是文本节点,可能是空白文本,不处理) if(personChildrenNodes.item(j).getNodeType()==Node.ELEMENT_NODE) { //子节点--元素节点 Element childNode =(Element)personChildrenNodes.item(j); if("name".equals(childNode.getNodeName())) { //如果子节点的名称是“name”.将子元素节点的第一个子节点的值赋给person对象 person.setName(childNode.getFirstChild().getNodeValue()); }else if("age".equals(childNode.getNodeValue())) { person.setAge(new Integer(childNode.getFirstChild().getNodeValue())); } } } list.add(person); } return list; }}
2)
SAX (Simple API for XML) est un standard d'analyse XML très largement utilisé. Le mode Handler est généralement utilisé pour traiter les documents XML. Ce mode de traitement est très différent de la façon dont nous sommes habituellement habitués à le comprendre. souvent des amis autour de nous. Lorsque vous entrez en contact avec SAX pour la première fois, vous aurez peut-être du mal à comprendre. En fait, SAX n'est pas compliqué, c'est juste une façon de penser différente, comme son nom l'indique, afin de nous permettre de traiter les documents XML de manière plus simple, commençons.
Copier le code Le code est le suivant :
package cn.itcast.service; import java.io.InputStream;import java.util.ArrayList;import java.util.List; import javax.xml.parsers.SAXParser;import javax.xml.parsers.SAXParserFactory; import org.xml.sax.Attributes;import org.xml.sax.SAXException;import org.xml.sax.helpers.DefaultHandler; import cn.itcast.model.Person; public class SAXPersonService { public List<Person> getPersons(InputStream inStream) throws Throwable { SAXParserFactory factory = SAXParserFactory.newInstance();//工厂模式还是单例模式? SAXParser parser =factory.newSAXParser(); PersonParse personParser =new PersonParse(); parser.parse(inStream, personParser); inStream.close(); return personParser.getPerson(); } private final class PersonParse extends DefaultHandler { private List<Person> list = null; Person person =null; private String tag=null; public List<Person> getPerson() { return list; } @Override public void startDocument() throws SAXException { list =new ArrayList<Person>(); } @Override public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { if("person".equals(localName)) { //xml元素节点开始时触发,是“person” person = new Person(); person.setId(new Integer(attributes.getValue(0))); } tag =localName;//保存元素节点名称 } @Override public void endElement(String uri, String localName, String qName) throws SAXException { //元素节点结束时触发,是“person” if("person".equals(localName)) { list.add(person); person=null; } tag =null;//结束时,需要清空tag } @Override public void characters(char[] ch, int start, int length) throws SAXException { if(tag!=null) { String data = new String(ch,start,length); if("name".equals(tag)) { person.setName(data); }else if("age".equals(tag)) { person.setAge(new Integer(data)); } } } } }
3)
L'analyse Pull est très similaire à l'analyse Sax. Ce sont deux analyses légères qui ont été intégrées dans le noyau Android, nous n'avons donc pas besoin d'ajouter un package jar tiers pour prendre en charge Pull. Les différences entre l'analyse Pull et l'analyse Sax sont (1) pull déclenche l'événement correspondant après la lecture du fichier XML La méthode appelante renvoie un nombre (2) pull peut contrôler l'endroit où elle veut analyser dans le programme. Arrêtez d'analyser.
Copier le code Le code est le suivant :
package cn.itcast.service; 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.XmlSerializer; import android.util.Xml; import cn.itcast.model.Person; public class PullPersonService { //保存xml文件 public static void saveXML(List<Person> list,Writer write)throws Throwable { XmlSerializer serializer =Xml.newSerializer();//序列化 serializer.setOutput(write);//输出流 serializer.startDocument("UTF-8", true);//开始文档 serializer.startTag(null, "persons"); //循环去添加person for (Person person : list) { serializer.startTag(null, "person"); serializer.attribute(null, "id", person.getId().toString());//设置id属性及属性值 serializer.startTag(null, "name"); serializer.text(person.getName());//文本节点的文本值--name serializer.endTag(null, "name"); serializer.startTag(null, "age"); serializer.text(person.getAge().toString());//文本节点的文本值--age serializer.endTag(null, "age"); serializer.endTag(null, "person"); } serializer.endTag(null, "persons"); serializer.endDocument(); write.flush(); write.close(); } public List<Person> getPersons(InputStream stream) throws Throwable { List<Person> list =null; Person person =null; XmlPullParser parser =Xml.newPullParser(); parser.setInput(stream,"UTF-8"); int type =parser.getEventType();//产生第一个事件 //只要当前事件类型不是”结束文档“,就去循环 while(type!=XmlPullParser.END_DOCUMENT) { switch (type) { case XmlPullParser.START_DOCUMENT: list = 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 Integer(parser.nextText())); } } break; case XmlPullParser.END_TAG: if("person".equals(parser.getName())) { list.add(person); person=null; } break; } type=parser.next();//这句千万别忘了哦 } return list; } }
Ce qui suit est le code de la classe Person dans la couche Modèle :
Copier le code Le code est le suivant :
package cn.itcast.model; public class Person {private Integer id;public Integer getId() { return id;}public void setId(Integer id) { this.id = id;} private String name;public String getName() { return name;} public void setName(String name) { this.name = name;} private Integer age;public Integer getAge() { return age;} public void setAge(Integer age) { this.age = age;} public Person(){}public Person(Integer id, String name, Integer age) { this.id = id; this.name = name; this.age = age;} @Overridepublic String toString() { return "Person [id=" + id + ", name=" + name + ", age=" + age + "]";} }
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!