Heim >Backend-Entwicklung >XML/RSS-Tutorial >Zusammenfassung der drei Methoden zum Betrieb von XML in Android
In Android gibt es im Allgemeinen mehrere Möglichkeiten, XML-Dateien zu bedienen: SAX-Operation, Pull-Operation, DOM-Operation usw. Unter diesen ist die DOM-Methode möglicherweise die bekannteste und entspricht auch dem W3C-Standard.
XML ist ein branchenweit anerkanntes Datenaustauschformat und ist auf verfügbar Verschiedene Plattformen und Sprachen weit verbreitet. Sein Standardtyp, seine Zuverlässigkeit, seine Sicherheit ... Daran besteht kein Zweifel. Wenn wir auf der Android-Plattform Datenspeicherung und Datenaustausch implementieren möchten, verwenden wir häufig das XML-Datenformat und XML-Dateien.
Tipps: Die in Android gespeicherten Daten umfassen im Allgemeinen die folgenden Typen: SharedPreferences (parametrisiert), XML-Dateien, SQLite-Datenbank, Netzwerk, ContentProvider (Inhaltsanbieter) usw.
In Android gibt es im Allgemeinen mehrere Möglichkeiten, XML-Dateien zu bedienen: SAX-Operation, Pull-Operation, DOM-Operation usw. Unter diesen ist die DOM-Methode möglicherweise die bekannteste und entspricht auch den W3C-Standards.
1)
Auf der Java-Plattform gibt es hervorragende Open-Source-Pakete wie DOM4J, die jedem die Nutzung des DOM-Standards erheblich erleichtern . XML-Dateien bearbeiten. In JavaScript haben verschiedene Browser-Parsing-Engines leicht unterschiedliche Parsing- und Operationen im DOM (dies ist jedoch nicht der Schwerpunkt dieses Kapitels). Auch die DOM-Methode hat ihre Nachteile. Normalerweise wird die XML-Datei einmal geladen und dann mithilfe der api des DOM analysiert. Dies verbraucht viel Speicher und hat gewisse Auswirkungen auf die Leistung. Obwohl die Konfiguration unserer Android-Telefone ständig verbessert wird, kann sie hinsichtlich des Speichers immer noch nicht mit herkömmlichen PCs mithalten. Daher wird unter Android nicht empfohlen, DOM zum Parsen und Bearbeiten von XML zu verwenden.
Code kopieren Der Code lautet wie folgt:
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) ist ein sehr weit verbreiteter XML-Analysestandard, der normalerweise zum Verarbeiten von XML-Dokumenten verwendet wird. Dieser Verarbeitungsmodus unterscheidet sich stark von dem, was wir normalerweise verstehen Wenn Sie zum ersten Mal mit SAX in Kontakt kommen, fällt es Ihnen möglicherweise etwas schwer, es zu verstehen. Tatsächlich ist SAX nicht kompliziert, es ist nur eine andere Denkweise. Damit wir XML-Dokumente einfacher verarbeiten können, fangen wir an.
Code kopieren Der Code lautet wie folgt:
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)
Pull-Parsing ist dem Sax-Parsing sehr ähnlich. Pull wurde in den Android-Kernel eingebettet, sodass wir kein JAR-Paket eines Drittanbieters hinzufügen müssen, um Pull zu unterstützen. Die Unterschiede zwischen Pull-Parsing und Sax-Parsing bestehen darin, dass (1) Pull das entsprechende -Ereignis nach dem Lesen der XML-Datei auslöst. Die aufrufende Methode gibt eine Zahl zurück. (2) Pull kann steuern, wo im Programm analysiert werden soll. Hören Sie auf zu analysieren.
Code kopieren Der Code lautet wie folgt:
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; } }
Das Folgende ist der Code der Person-Klasse in der Modellebene:
Code kopieren Der Code lautet wie folgt:
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 + "]";} }
Das obige ist der detaillierte Inhalt vonZusammenfassung der drei Methoden zum Betrieb von XML in Android. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!