用android自带的DOM来解析XML解析器
- 格式:doc
- 大小:45.00 KB
- 文档页数:6
Android利⽤Document实现xml读取和写⼊操作本⽂实例为⼤家分享了利⽤Document实现xml读取和写⼊操作,供⼤家参考,具体内容如下⾸先先来介绍⼀下什么xml?xml是可扩展标记语⾔,他可以⽤来标记数据,定义数据类型。
是⼀种允许⽤户对⾃⼰标记语⾔进⾏定义的源语⾔。
解析XML⽂件的⽅法有很多⽅法:dom解析,就是document以及PULL和SAX⽅法。
今天给⼤家分享⼀下如何⽤Document来操作XML。
效果图:⾸先先对布局⽂件进⾏操作:activity_main.xml:<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="/apk/res/android"xmlns:tools="/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"tools:context="com.oak.d3_xml.MainActivity"><TextViewandroid:id="@+id/tv"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="Hello World!" /><Buttonandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="⽣成"android:id="@+id/bt_create"/><Buttonandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="读取"android:id="@+id/bt_read"/></LinearLayout>主代码:MainActivity.java: 值得注意的是Document类中的包要导W3C的包package com.oak.d3_xml;import android.os.Bundle;import android.support.v7.app.AppCompatActivity;import android.view.View;import android.widget.Button;import android.widget.TextView;import android.widget.Toast;import org.w3c.dom.Document;import org.w3c.dom.Element;import org.w3c.dom.NodeList;import org.xml.sax.SAXException;import java.io.File;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;import java.io.OutputStream;import javax.xml.parsers.DocumentBuilder;import javax.xml.parsers.DocumentBuilderFactory;import javax.xml.parsers.ParserConfigurationException;import javax.xml.transform.Transformer;import javax.xml.transform.TransformerConfigurationException;import javax.xml.transform.TransformerException;import javax.xml.transform.TransformerFactory;import javax.xml.transform.dom.DOMSource;import javax.xml.transform.stream.StreamResult;public class MainActivity extends AppCompatActivity {private TextView textView;//⽤于展⽰读取xml的内容private Button bt_create;//⽤于创建xml⽂件private Button bt_read;//⽤于读取xml⽂件private File file;//xml⽂件路径@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(yout.activity_main);file = new File(getFilesDir(),"languages.xml");//获取到xml⽂件textView = (TextView) findViewById();//拿到textView控件bt_create = (Button) findViewById(R.id.bt_create);//拿到创建按钮bt_read = (Button) findViewById(R.id.bt_read);//拿到读取按钮bt_create.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {//这⾥利⽤的是dom对xml进⾏操作的//实例化⼀个DocmentBuilderFactory,调⽤其静态⽅法获取DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();try {//实例化⼀个DocumentBuilderDocumentBuilder builder = builderFactory.newDocumentBuilder();//实例化⼀个xml⽂件Document newxml = builder.newDocument();//创建⼀个根标签Element languages = newxml.createElement("languages");//为其设置属性languages.setAttribute("cat","it");//for循坏3次,分别创建出三个标签,每个标签都包含内容for (int i=0;i<3;i++){//创建languages的⼦标签lanElement lan = newxml.createElement("lan");//设置属性lan.setAttribute("id",i+"");//创建lan的⼦标签Element name = newxml.createElement("name");//设置内容name.setTextContent("Java"+i);//创建lan的⼦标签Element ide = newxml.createElement("ide");//设置内容ide.setTextContent("Eclipse"+i);//将name和ide分别加⼊lan这个标签中lan.appendChild(name);lan.appendChild(ide);//将lan将⼊languages标签中languages.appendChild(lan);}//将languages加⼊到xml⽂件中newxml.appendChild(languages);//实例化Transformer⼯⼚TransformerFactory transformerFactory = TransformerFactory.newInstance();//获取到TransformerTransformer transformer = transformerFactory.newTransformer();//设置输出格式transformer.setOutputProperty("encoding","UTF-8");//设置输出流OutputStream os = new FileOutputStream(file);//将⽂件写出transformer.transform(new DOMSource(newxml),new StreamResult(os));Toast.makeText(getApplicationContext(),"⽣成成功",Toast.LENGTH_SHORT).show(); } catch (ParserConfigurationException e) {e.printStackTrace();} catch (TransformerConfigurationException e) {e.printStackTrace();} catch (FileNotFoundException e) {e.printStackTrace();} catch (TransformerException e) {e.printStackTrace();}}});bt_read.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {//获取到DocumentBuilder的⼯⼚实例化DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();try {//拿到DocumentBuilderDocumentBuilder builder = builderFactory.newDocumentBuilder();//解析xml⽂件Document xml = builder.parse(file);//获取其根标签Element languages = xml.getDocumentElement();//根据⼦标签进⾏查找,返回的是⼀个list集合NodeList list = languages.getElementsByTagName("lan");textView.setText("");//将textView中的内容置空for (int i=0; i<list.getLength(); i++){//获取到⼦标签lanElement lan = (Element) list.item(i);//获取到他的属性String id = lan.getAttribute("id");//获取到他的⼦标签name的内容String name = lan.getElementsByTagName("name").item(0).getTextContent();//获取到他的⼦标签ide的内容String ide = lan.getElementsByTagName("ide").item(0).getTextContent();//显⽰到textView中textView.append(id+"\n"+name+"\n"+ide+"\n");}} catch (ParserConfigurationException e) {e.printStackTrace();} catch (SAXException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}});}}到这⾥利⽤Document来操作XML⽂件就完成了。
声明:CSDN----liuhe688原创内容XML在各种开发中都广泛应用,Android也不例外。
作为承载数据的一个重要角色,如何读写XML成为Android开发中一项重要的技能。
今天就由我向大家介绍一下在Android平台下几种常见的XML解析和创建的方法。
在Android中,常见的XML解析器分别为SAX解析器、DOM解析器和PULL解析器,下面,我将一一向大家详细介绍。
SAX解析器:SAX(Simple API for XML)解析器是一种基于事件的解析器,它的核心是事件处理模式,主要是围绕着事件源以及事件处理器来工作的。
当事件源产生事件后,调用事件处理器相应的处理方法,一个事件就可以得到处理。
在事件源调用事件处理器中特定方法的时候,还要传递给事件处理器相应事件的状态信息,这样事件处理器才能够根据提供的事件信息来决定自己的行为。
SAX解析器的优点是解析速度快,占用内存少。
非常适合在Android移动设备中使用。
DOM解析器:DOM是基于树形结构的的节点或信息片段的集合,允许开发人员使用DOM API遍历XML 树、检索所需数据。
分析该结构通常需要加载整个文档和构造树形结构,然后才可以检索和更新节点信息。
由于DOM在内存中以树形结构存放,因此检索和更新效率会更高。
但是对于特别大的文档,解析和加载整个文档将会很耗资源。
PULL解析器:PULL解析器的运行方式和SAX类似,都是基于事件的模式。
不同的是,在PULL解析过程中,我们需要自己获取产生的事件然后做相应的操作,而不像SAX那样由处理器触发一种事件的方法,执行我们的代码。
PULL解析器小巧轻便,解析速度快,简单易用,非常适合在Android移动设备中使用,Android系统内部在解析各种XML时也是用PULL解析器。
以上三种解析器,都是非常实用的解析器,我将会一一介绍。
我们将会使用这三种解析技术完成一项共同的任务。
我们新建一个项目,项目结构如下:我会在项目的assets目录中放置一个XML文档books.xml,内容如下:[xhtml]view plaincopy1.<?xml version="1.0"encoding="utf-8"?>2.<books>3.<book>4.<id>1001</id>5.<name>Thinking In Java</name>6.<price>80.00</price>7.</book>8.<book>9.<id>1002</id>10.<name>Core Java</name>11.<price>90.00</price>12.</book>13.<book>14.<id>1003</id>15.<name>Hello, Andriod</name>16.<price>100.00</price>17.</book>18.</books>然后我们分别使用以上三种解析技术解析文档,得到一个List<Book>的对象,先来看一下Book.java的代码:[java]view plaincopy1.package com.scott.xml.model;2.3.public class Book {4.private int id;5.private String name;6.private float price;7.8.public int getId() {9.return id;10. }11.12.public void setId(int id) {13.this.id = id;14. }15.16.public String getName() {17.return name;18. }19.20.public void setName(String name) { = name;22. }23.24.public float getPrice() {25.return price;26. }27.28.public void setPrice(float price) {29.this.price = price;30. }31.32.@Override33.public String toString() {34.return"id:" + id + ", name:" + name + ", price:" + price;35. }36.}最后,我们还要把这个集合对象中的数据生成一个新的XML文档,如图:生成的XML结构跟原始文档略有不同,是下面这种格式:[xhtml]view plaincopy1.<?xml version="1.0"encoding="UTF-8"?>2.<books>3.<book id="1001">4.<name>Thinking In Java</name>5.<price>80.0</price>6.</book>7.<book id="1002">8.<name>Core Java</name>9.<price>90.0</price>10.</book>11.<book id="1003">12.<name>Hello, Andriod</name>13.<price>100.0</price>14.</book>15.</books>接下来,就该介绍操作过程了,我们先为解析器定义一个BookParser接口,每种类型的解析器需要实现此接口。
解析Xml⽂件的三种⽅式1、Sax解析(simple api for xml) 使⽤流式处理的⽅式,它并不记录所读内容的相关信息。
它是⼀种以事件为驱动的XML API,解析速度快,占⽤内存少。
使⽤回调函数来实现。
1class MyDefaultHander extends DefaultHandler{2private List<Student> list;3private Student student;45 @Override6public void startDocument() throws SAXException {7super.startDocument();8 list=new ArrayList<>();9 }1011 @Override12public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {13super.startElement(uri, localName, qName, attributes);14if(qName.equals("student")){15 student=new Student();1617 }18 preTag=qName;19 }2021 @Override22public void endElement(String uri, String localName, String qName) throws SAXException {23if(qName.equals("student")){24 list.add(student);25 }26 preTag=null;27 }2829 @Override30public void characters(char[] ch, int start, int length) throws SAXException {31if(preTag!=null){32if(preTag.equals("id")){33 student.setId(Integer.parseInt(new String(ch,start,length)));34 }else if(preTag.equals("name")){35 student.setName(new String(ch,start,length));36 }else if(preTag.equals("age")){37 student.setAge(Integer.parseInt(new String(ch,start,length)));38 }39 }40 }41public List<Student> getStudents(){42return list;43 }44 }45public List<Student> sax_parser(){46 List<Student> list=null;47try {48 SAXParser parser= SAXParserFactory.newInstance().newSAXParser();49 InputStream is= getAssets().open("student.xml");50 MyDefaultHander hander=new MyDefaultHander();51 parser.parse(is,hander);52 list= hander.getStudents();53 } catch (ParserConfigurationException e) {54 e.printStackTrace();55 } catch (SAXException e) {56 e.printStackTrace();57 } catch (IOException e) {58 e.printStackTrace();59 }60return list;61 }2、Dom解析 DOM(Document Object Model) 是⼀种⽤于XML⽂档的对象模型,可⽤于直接访问XML⽂档的各个部分。
Android开发基础(试卷编号162)说明:答案和解析在试卷最后1.[单选题]下面哪个不是Android SDK中的ViewGroup(视图容器)?A)LinearLayoutB)ListViewC)GridViewD)Button2.[单选题]下列属性中,用于设置LinearLayout方向的是( )。
A)orientationB)gravityC)layout_gravityD)padding3.[单选题]以下哪个控件用来显示文本()A)ImageViewB)TextViewC)EditViewD)Button4.[单选题]显示Spinner控件需要用到的适配器是()A)ArrayAdapterB)SimpleAdapterC)SimpleCursorAdapterD)Adapter5.[单选题]下列哪一个选项不属于AdapterView 类的子选项? Gallery ListViewSpinnerGridViewA)ListViewB)SpinnerC)GridViewD)ScrollView6.[单选题]关于适配器的说法正确的是?A)它主要是用来存储数据B)它主要用来把数据绑定到组件上7.[单选题]下列( )属于未成年人的不良行为。
A)多次偷窃B)旷课、夜不归宿C)吸食、注射毒品D)携带管制刀具,屡教不改8.[单选题]下面关于Android dvm的进程和Linux 的进程, 应用程序的进程说法正确的是()A)DVM指dalivk 的虚拟机. 每一个Android 应用程序都在它自己的进程中运行, 不一定拥有一个独立的Dalvik 虚拟机实例. 而每一个DVM都是在Linux 中的一个进程, 所以说可以认为是同一个概念.B)DVM指dalivk 的虚拟机. 每一个Android 应用程序都在它自己的进程中运行, 不一定拥有一个独立的Dalvik 虚拟机实例. 而每一个DVM不一定都是在Linux 中的一个进程, 所以说不是一个概念.C)DVM指dalivk 的虚拟机. 每一个Android 应用程序都在它自己的进程中运行, 都拥有一个独立的Dalvik 虚拟机实例. 而每一个DVM不一定都是在Linux 中的一个进程, 所以说不是一个概念.D)DVM指dalivk 的虚拟机. 每一个Android 应用程序都在它自己的进程中运行, 都拥有一个独立的 Dalvik 虚拟机实例. 而每一个DVM都是在Linux 中的一个进程, 所以说可以认为是同一个概念.9.[单选题]把播放音乐的操作放到Service里以下说法正确的是( ).A)可以提高运行效率B)播放音乐的操作必须放入到服务里C)在Service里更安全D)放到服务里目的是提升进程的优先级,不容易被系统回收10.[单选题]内部存储和外部存储需要额外的权限吗?( )A)不需要,不需要B)需要,不需要C)需要,需要D)不需要,需要11.[单选题]请问组件与数据之间通过下面哪个类进行连接?()A)AdapterD)GridView12.[单选题]数据下标越界,则发生( )异常。
org.w3c.dom(javadom)解析XML⽂档位于org.w3c.dom操作XML会⽐较简单,就是将XML看做是⼀颗树,DOM就是对这颗树的⼀个数据结构的描述,但对⼤型XML⽂件效果可能会不理想⾸先来了解点Java DOM 的 API:1.解析器⼯⼚类:DocumentBuilderFactory创建的⽅法:DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();2.解析器:DocumentBuilder创建⽅法:通过解析器⼯⼚类来获得 DocumentBuilder db = dbf.newDocumentBuilder();3.⽂档树模型Document创建⽅法:a.通过xml⽂档 Document doc = db.parse("bean.xml"); b.将需要解析的xml⽂档转化为输⼊流 InputStream is = new FileInputStream("bean.xml");Document doc = db.parse(is);Document对象代表了⼀个XML⽂档的模型树,所有的其他Node都以⼀定的顺序包含在Document对象之内,排列成⼀个树状结构,以后对XML⽂档的所有操作都与解析器⽆关,直接在这个Document对象上进⾏操作即可;包含的⽅法:4.节点列表类NodeListNodeList代表了⼀个包含⼀个或者多个Node的列表,根据操作可以将其简化的看做为数组5.节点类NodeNode对象是DOM中最基本的对象,代表了⽂档树中的抽象节点。
但在实际使⽤中很少会直接使⽤Node对象,⽽是使⽤Node对象的⼦对象Element,Attr,Text等6.元素类Element是Node类最主要的⼦对象,在元素中可以包含属性,因⽽Element中有存取其属性的⽅法7.属性类Attr代表某个元素的属性,虽然Attr继承⾃Node接⼝,但因为Attr是包含在Element中的,但并不能将其看做是Element的⼦对象,因为Attr并不是DOM树的⼀部分基本的知识就到此结束,更加具体的⼤家可以参阅JDK API⽂档实战:1.使⽤DOM来遍历XML⽂档中的全部内容并且插⼊元素:school.xml⽂档:<?xml version = "1.0" encoding = "utf-8"?><School><Student><Name>沈浪</Name><Num>1006010022</Num><Classes>信管2</Classes><Address>浙江杭州3</Address><Tel>123456</Tel></Student><Student><Name>沈1</Name><Num>1006010033</Num><Classes>信管1</Classes><Address>浙江杭州4</Address><Tel>234567</Tel></Student><Student><Name>沈2</Name><Num>1006010044</Num><Classes>⽣⼯2</Classes><Address>浙江杭州1</Address><Tel>345678</Tel></Student><Student><Name>沈3</Name><Num>1006010055</Num><Classes>电⼦2</Classes><Address>浙江杭州2</Address><Tel>456789</Tel></Student></School>DomDemo.java1 package xidian.sl.dom;2import java.io.FileOutputStream;34import javax.xml.parsers.DocumentBuilder;5import javax.xml.parsers.DocumentBuilderFactory;67import org.apache.crimson.tree.XmlDocument;8import org.w3c.dom.Document;9import org.w3c.dom.Element;10import org.w3c.dom.NodeList;111213public class DomDemo {14/**15 * 遍历xml⽂档16 * */17public static void queryXml(){18try{19//得到DOM解析器的⼯⼚实例20 DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();21//从DOM⼯⼚中获得DOM解析器22 DocumentBuilder dbBuilder = dbFactory.newDocumentBuilder();23//把要解析的xml⽂档读⼊DOM解析器24 Document doc = dbBuilder.parse("src/xidian/sl/dom/school.xml");25 System.out.println("处理该⽂档的DomImplementation对象 = "+ doc.getImplementation());26//得到⽂档名称为Student的元素的节点列表27 NodeList nList = doc.getElementsByTagName("Student");28//遍历该集合,显⽰结合中的元素及其⼦元素的名字29for(int i = 0; i< nList.getLength() ; i ++){30 Element node = (Element)nList.item(i);31 System.out.println("Name: "+ node.getElementsByTagName("Name").item(0).getFirstChild().getNodeValue());32 System.out.println("Num: "+ node.getElementsByTagName("Num").item(0).getFirstChild().getNodeValue());33 System.out.println("Classes: "+ node.getElementsByTagName("Classes").item(0).getFirstChild().getNodeValue());34 System.out.println("Address: "+ node.getElementsByTagName("Address").item(0).getFirstChild().getNodeValue());35 System.out.println("Tel: "+ node.getElementsByTagName("Tel").item(0).getFirstChild().getNodeValue());36 }3738 }catch (Exception e) {39// TODO: handle exception40 e.printStackTrace();41 }42 }43/**44 * 向已存在的xml⽂件中插⼊元素45 * */46public static void insertXml(){47 Element school = null;48 Element student = null;49 Element name = null;50 Element num = null;51 Element classes = null;52 Element address = null;53 Element tel = null;54try{55//得到DOM解析器的⼯⼚实例56 DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();57//从DOM⼯⼚中获得DOM解析器58 DocumentBuilder dbBuilder = dbFactory.newDocumentBuilder();59//把要解析的xml⽂档读⼊DOM解析器60 Document doc = dbBuilder.parse("src/xidian/sl/dom/school.xml");61//得到⽂档名称为Student的元素的节点列表62 NodeList nList = doc.getElementsByTagName("School");63 school = (Element)nList.item(0);64//创建名称为Student的元素65 student = doc.createElement("Student");66//设置元素Student的属性值为23167 student.setAttribute("examId", "23");68//创建名称为Name的元素69 name = doc.createElement("Name");70//创建名称为⾹⾹的⽂本节点并作为⼦节点添加到name元素中71 name.appendChild(doc.createTextNode("⾹⾹"));72//将name⼦元素添加到student中73 student.appendChild(name);74/**75 * 下⾯的元素依次加⼊即可76 * */77 num = doc.createElement("Num");78 num.appendChild(doc.createTextNode("1006010066"));79 student.appendChild(num);8081 classes = doc.createElement("Classes");82 classes.appendChild(doc.createTextNode("眼视光5"));83 student.appendChild(classes);8485 address = doc.createElement("Address");86 address.appendChild(doc.createTextNode("浙江温州"));87 student.appendChild(address);8889 tel = doc.createElement("Tel");90 tel.appendChild(doc.createTextNode("123890"));91 student.appendChild(tel);9293//将student作为⼦元素添加到树的根节点school94 school.appendChild(student);95//将内存中的⽂档通过⽂件流⽣成insertSchool.xml,XmlDocument位于crison.jar下96 ((XmlDocument)doc).write(new FileOutputStream("src/xidian/sl/dom/insertSchool.xml"));97 System.out.println("成功");98 }catch (Exception e) {99// TODO: handle exception100 e.printStackTrace();101 }102 }103public static void main(String[] args){104//读取105 DomDemo.queryXml();106//插⼊107 DomDemo.insertXml();108 }109 }110运⾏后结果:然后到⽬录下查看⽣成的xml⽂件:打开查看内容:上⾯添加元素后输出的⽂件与之前的⽂件不是同⼀个⽂件,如果需要输出到原⽂件中,那么只要将路径改为原⽂间路径即可:src/xidian/sl/dom/school.xml2.创建XML过程与插⼊过程相似,就是Document需要创建package xidian.sl.dom;import java.io.FileOutputStream;import javax.xml.parsers.DocumentBuilder;import javax.xml.parsers.DocumentBuilderFactory;import org.apache.crimson.tree.XmlDocument;import org.w3c.dom.Document;import org.w3c.dom.Element;public class CreateNewDom {/*** 创建xml⽂档* */public static void createDom(){Document doc;Element school,student;Element name = null;Element num = null;Element classes = null;Element address = null;Element tel = null;try{//得到DOM解析器的⼯⼚实例DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();//从DOM⼯⼚中获得DOM解析器DocumentBuilder dbBuilder = dbFactory.newDocumentBuilder();//创建⽂档树模型对象doc = dbBuilder.newDocument();if(doc != null){//创建school元素school = doc.createElement("School");//创建student元素student = doc.createElement("Student");//设置元素Student的属性值为231student.setAttribute("examId", "23");//创建名称为Name的元素name = doc.createElement("Name");//创建名称为⾹⾹的⽂本节点并作为⼦节点添加到name元素中name.appendChild(doc.createTextNode("⾹⾹"));//将name⼦元素添加到student中student.appendChild(name);/*** 下⾯的元素依次加⼊即可* */num = doc.createElement("Num");num.appendChild(doc.createTextNode("1006010066"));student.appendChild(num);classes = doc.createElement("Classes");classes.appendChild(doc.createTextNode("眼视光5"));student.appendChild(classes);address = doc.createElement("Address");address.appendChild(doc.createTextNode("浙江温州"));student.appendChild(address);tel = doc.createElement("Tel");tel.appendChild(doc.createTextNode("123890"));student.appendChild(tel);//将student作为⼦元素添加到树的根节点schoolschool.appendChild(student);//添加到⽂档树中doc.appendChild(school);//将内存中的⽂档通过⽂件流⽣成insertSchool.xml,XmlDocument位于crison.jar下((XmlDocument)doc).write(new FileOutputStream("src/xidian/sl/dom/createSchool.xml")); System.out.println("创建成功");}}catch (Exception e) {// TODO: handle exceptione.printStackTrace();}}public static void main(String[] args) {CreateNewDom.createDom();}}运⾏结果:DOM的操作应该还是⾮常简单明了的,掌握了没哦。
Android期中试题9安卓中期测试1。
活动的布局文件在哪个目录下()RES/XML RES/values RES/layout RES/layout2。
在以下选项中,onActivityResult方法中的参数描述错误是() requestCode表示启动活动时传递的请求代码resultCode,表示返回数据时传递的结果代码数据,表示携带返回数据的整数数据,表示启动活动时传递的整数3。
在BaseAdapter的方法中,根据条目的位置返回其视图的方法是() GetView()GetItem()GetItemView()GetItemID()4。
安卓系统使用xmlPullParser解析器来解析xml,获取解析的事件类型的方法是()getDocument()GetDocumentTag()GetEventType()GetAttribute()5。
使用SQLiteOpenHelper类,您可以通过()生成数据库并管理数据库版本getdatabase()getwritabledatabase()getreadabledatabase()getabledatabase()6。
下列哪些功能需要使用ContentProvider()来实现阅读系统中的短信内容,建立数据库,启动后自动启动程序播放音乐。
7.()启动模式类似于标准模式,除了当启动活动已经位于堆栈顶部时,它直接用于不创建新实例。
单任务singletop单任务和singletopsingle实例8。
在安卓用户界面开发中,如何设置一个控件在网格布局中占据3行安卓:布局_列= \安卓:布局_行= \安卓:行= \安卓:布局_列= \9。
在活动中获取ContentResolver实例对象的方法是()new content resolver()getcontent resolver()new instance()content uri。
newinstance ()10。
Android创建与解析XML(⼆)——详解Dom⽅式1. Dom概述Dom⽅式创建XML,应⽤了标准xml构造器 javax.xml.parsers.DocumentBuilder 来创建 XML ⽂档,需要导⼊以下内容javax.xml.parsersjavax.xml.parsers.DocumentBuilderjavax.xml.parsers.DocumentBuilderFactoryjavax.xml.parsers.ParserConfigurationException;javax.xml.transformjavax.xml.transform.TransformerFactoryjavax.xml.transform.Transformerjavax.xml.transform.dom.DOMSourcejavax.xml.transform.stream.StreamResultjavax.xml.transform.OutputKeys;javax.xml.transform.TransformerFactoryConfigurationError;javax.xml.transform.TransformerConfigurationException;javax.xml.transform.TransformerException;org.w3c.domorg.w3c.dom.Document;org.w3c.dom.Element;org.w3c.dom.Node;org.w3c.dom.DOMException;org.w3c.dom.NodeList;org.xml.sax.SAXException;创建和解析xml的效果图:2、Dom 创建 XMLDom,借助 javax.xml.parsers.DocumentBuilder,可以创建 org.w3c.dom.Document 对象。
Android解析XML文件的三方法Pull[日期:2010-11-12] 来源:Android 作者:Android [字体:大中小]除了可以使用SAX和DOM解析XML文件,大家也可以使用Android内置的Pull解析器解析XML文件。
Pull解析器的运行方式与SAX 解析器相似。
它提供了类似的事件,如:开始元素和结束元素事件,使用parser.next()可以进入下一个元素并触发相应事件。
事件将作为数值代码被发送,因此可以使用一个switch对感兴趣的事件进行处理。
当元素开始解析时,调用parser.nextText()方法可以获取下一个Text类型节点的值。
public class PullService {public static List<Person> readXML(InputStream inputStream) throws IOException{ XmlPullParser parser = Xml.newPullParser();try {parser.setInput(inputStream, "UTF-8");int eventType = parser.getEventType();Person currentPerson = null;List<Person> persons = null;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 (name.equalsIgnoreCase("person")) {currentPerson = new Person();currentPerson.setId(new Integer(parser.getAttributeV alue(null, "id")));} else if (currentPerson != null) {if (name.equalsIgnoreCase("name")) {currentPerson.setName(parser.nextText());// 如果后面是Text节点,即返回它的值} else if (name.equalsIgnoreCase("age")) {currentPerson.setAge(new Short(parser.nextText()));}}break;case XmlPullParser.END_TAG://结束元素事件if (parser.getName().equalsIgnoreCase("person") && currentPerson != null) {persons.add(currentPerson);currentPerson = null;}break;}eventType = parser.next();}inputStream.close();return persons;} catch (Exception e) {e.printStackTrace();}return null;}//将内容保存至XML文件public static String writeXML(List<Person> persons, Writer writer){ XmlSerializer serializer = Xml.newSerializer();try {serializer.setOutput(writer);serializer.startDocument("UTF-8", true);//第一个参数为命名空间,如果不使用命名空间,可以设置为nullserializer.startTag("", "persons");for (Person person : persons){serializer.startTag("", "person");serializer.attribute("", "id", person.getId().toString());serializer.startTag("", "name");serializer.text(person.getName());serializer.endTag("", "name");serializer.startTag("", "age");serializer.text(person.getAge().toString());serializer.endTag("", "age");serializer.endTag("", "person");}serializer.endTag("", "persons");serializer.endDocument();return writer.toString();} catch (Exception e) {e.printStackTrace();}return null;}}生成的person.xml如下:<?xml version="1.0" encoding="UTF-8"?><persons><person id="23"><name>liming</name><age>30</age></person><person id="20"><name>lili</name><age>25</age></person></persons>123下一页【内容导航】第1页:Pull 第2页:DOM第3页:SAX顶一下0通用编程语言GosuLinux内核Hook系统调用相关资讯Android Android--Alarm,定时闹钟(今11:07)Android 添加按电源键结束通话(01月09日)谷歌已将Android 4.2 源代码发布(11/14/2012 18:58:20)Android合并音频文件(01月25日)[图+视频]Android手机刷Ubuntu?一(11/15/2012 06:48:15)Android SDK 4.2 正式版发布(11/14/2012 18:54:06)图片资讯[图+视频]Android手机谷歌已将Android 4.2岁月如“歌”详解Android 4.2 发布,手好消息! Android回归Android机器人“元祖Android与iOS垄断智能谷歌Android 系统生态本文评论查看全部评论(0) 表情:姓名:匿名字数点评:同意评论声明发表评论声明■尊重网上道德,遵守中华人民共和国的各项有关法律法规■承担一切因您的行为而直接或间接导致的民事或刑事法律责任■本站管理人员有权保留或删除其管辖留言中的任意内容■本站有权在网站内转载或引用您的评论■参与本评论即表明您已经阅读并接受上述条款-最新资讯Android--GestureOverlayView,手势识别Android--通过ActivityGroup实现Tab的选卡效果Android--Alarm,定时闹钟Android--将布局保存成图像Android开发教程:使用include调用布局Android--取得MD5指纹,取得MapKeyAndroid--MapView.第一个简单的MapViewAndroid开发教程:关于Cursor空指针的问题Android开发教程:取得布局中指定控件的宽高Android开发教程:动态添加控件本周热门Android下使用最新FaceBook SDK 3.0在Windows平台下使用安装GCC(图)Android核心分析Android手机Root授权原理细节全解析Ubuntu 10.04下编译OpenWrt完全新手教程Android SD卡路径问题以及如何获取SDCard 内存Linux shell编程嵌入式Linux学习笔记Node.js零起点开发教程Linux中LCD设备驱动Linux公社简介- 广告服务- 网站地图- 帮助信息- 联系我们本站(LinuxIDC)所刊载文章不代表同意其说法或描述,仅为提供更多信息,也不构成任何建议。
读写XML的四种方法XML(eXtensible Markup Language)是一种用于表示和传输数据的标记语言。
它具有良好的可读性和扩展性,被广泛应用于Web开发、数据交换和配置文件等领域。
在读写和处理XML数据时,有许多方法可供选择。
本文将介绍四种常见的读写XML的方法:DOM、SAX、JDOM、和XMLStreamReader/XMLStreamWriter。
1. DOM(Document Object Model):DOM是一种基于树形结构的解析器,它将整个XML文档加载到内存中,并将其表示为一个对象树。
在DOM中,每个XML元素都被表示为一个节点(Node),可以通过节点的属性和方法对其进行操作。
读取XML文档时,可以使用DOM解析器将其转换为一个DOM树,然后通过节点的方法访问和修改树结构。
写入XML文档时,可以通过创建和修改节点来构建DOM树,并使用DOM解析器将其保存为XML文档。
使用DOM读取XML文档的基本步骤如下:- 创建一个DocumentBuilderFactory对象。
- 根据DocumentBuilderFactory对象创建一个DocumentBuilder对象。
- 使用DocumentBuilder对象解析XML文档,并返回一个Document对象。
- 通过Document对象的方法遍历和操作XML文档的节点。
使用DOM写入XML文档的基本步骤如下:- 创建一个DocumentBuilderFactory对象。
- 根据DocumentBuilderFactory对象创建一个DocumentBuilder对象。
- 使用DocumentBuilder对象创建一个Document对象。
- 通过Document对象的方法创建和添加元素节点、属性节点等。
- 使用TransformerFactory和Transformer对象将Document对象保存为XML文档。
DOM的优点是易于使用和理解,可以方便地遍历和修改XML文档。
用android自带的DOM来解析XML解析器最近在项目中遇到了一个解析XML的问题,我们是用android自带的DOM解析器来解析XML的,但发现了一个android的问题,那就是在2.3的SDK上面,无法解析像<, >, 等字符串。
尽管我们从服务器端返回的数据中,应该是不能包含< >这样的字符,应该使用转义,但有时候,由于历史原因,导致服务器端不能作这样的修正,所以这样的问只能是在客户端来解决了。
下面我就说一说我们是如何解决这种问的。
1,现象我们的解析代码是:view sourceprint?1.DocumentBuil derFactory factory = DocumentBuil derFactory.newInstance(); 2.DocumentBuil der buil der = factory.newDocumentBuil der(); 3.Document documnet = buil der.parse(in);4.El ement root = documnet.getDocumentEl ement();其中buil der.parse(in)中的in是一个InputStream类型的输入流,例如有如下一段XML:view sourceprint?01.<?xml version="1.0" ?>02.<data>03.<success>1</success>04.<error>05.<code></code>06.<message></message>07.</error>08.<result>09.<history_info_list>10.<row>11.<purchase_info_id>dnrxmauxecj3z6e4</purchase_info_id><titl e_id>134051</titl e_id>13.<titl e>まもって守護月天!再逢<Retrouvaill es></titl e>14.<volume_number>001</volume_number>15.<author_name>桜野みねね</author_name>16.<contents_name>まもって守護月天!再逢<Retrouvaill es>1巻</contents_name> 17.<date_open>2011-12-02</date_open>18.<purchase_date>2012-02-06 18:39:48</purchase_date>19.<image_url>/resources/c_media/images/thumb/262/134051_01_1_L.jpg</image_url> 20.<contents>21.<story_number>1</story_number>22.<contents_id>BT000013405100100101500014</contents_id>23.<fil e_size>34168162</fil e_size>24.<Within_Wifi>0</Within_Wifi>25.</contents>26.<text_to_speech_flg>0</text_to_speech_flg>27.<restrict_num>-1</restrict_num>28.<issue>3</issue>29.<subscription>0</subscription>30.<adult_flg>0</adult_flg>31.</row>32.</history_info_list>33.</result></data>其中有一个titl e结点,中间包含< >,但是XML中已经用了转义,所以应该是能正常解析出来的,但在SDK2.3(准确说来应该是3.0以下),它对这些转义字符作了特殊处理,它会把titl e中间文字当成四个文本结点,其内容分别是:1, まもって守護月天!再逢2, <3, Retrouvaill es4, > 1巻所以,这是不正确的,其实它应该就是一个节点,内容是[ まもって守護月天!再逢<Retrouvaill es> 1巻]。
不过在3.0的SDK,这种问题被修正了。
2,问题的原因好,上面说的是现象,我们现在说一下造成这种现象的原因及解决办法。
翻看android源码发现:android的XML解析实现用的是apache harmony代码,我想android的dalvik应该就是apache的harmonyxml parser,这个没有深究。
而实际上harmony的XML解析用的又是KXML,看来android就是一堆开源的代码叠加起来的。
下面仔细来看看:KXML的处理过程是这样的,对文本进行遍历,当发现<、/>、&等这些关键字符时,触发事件,有兴趣可以看看源码;源代码在:\libcore\luni\src\main\java\org\apache\harmony\xml\parsers\DocumentBuil derImpl.java view sourceprint?01.113行:XmlPullParser parser = new KXmlParser();02.265行:else if (token == XmlPullParser.TEXT)03.node.appendChil d(document.createTextNode(parser.getText()));04.277行:else if (token == XmlPullParser.ENTITY_REF)05.String entity = parser.getName(); if (entityResolver != null) {06.// TODO Impl ement this...07.} String replacement = resolveStandardEntity(entity);08.if (replacement != null) {09.node.appendChil d(document.createTextNode(replacement));10.} else {11.node.appendChil d(document.createEntityReference(entity));12.从上面可以看到,处理带有&<>&;这些字符时,分成了几段文本节点。
3,解决方案问题的原因我们已经知道了,怎么解决呢?1,判断一下,如果子结点全是文本结点的话,把结点的所有文本字符串拼起来。
2,更改上面的处理方法,node.appendChil d这行代码,当发现这个节点的第一个子节点是文本节点时,把当前字符加上去。
在项目中所采用的方法是第一种,因为这方法简单,实现如下:view sourceprint?01./**02.* This method is used to indicate the specified node's all sub nodes are text nod e or not.03.*04.* @param node The specified node.05.*06.* @return true if all sub nodes are text type, otherwise false.07.*/08.public static bool ean areAllSubNodesTextType(Node nod e)09.{10.if (null != node)11.{12.int nodeCount = node.getChil dNodes().getLength();13.NodeList list = nod e.getChil dNodes();14.for (int i = 0; i < nodeCount; ++i)15.{16.short noteType = list.item(i).getNodeType();17.if (Node.TEXT_NODE != noteType)18.19.return false;20.}21.}22.}23.24.return true;25.}26.27./**28.* Get the nod e value. If the nod e's all sub nodes are text type, it will append 29.* all sub node's text as a whol e text and return it.30.*31.* @param node The specified node.32.*33.* @return The value.34.*/35.private static String getNodeValue(Nod e node)36.{37.if (null == node)38.{39.return "";40.}41.StringBuffer sb = new StringBuffer();43.44.int nodeCount = node.getChil dNodes().getLength();45.NodeList list = nod e.getChil dNodes();46.for (int i = 0; i < nodeCount; ++i)47.{48.short noteType = list.item(i).getNodeType();49.if (Node.TEXT_NODE == noteType)50.{51.sb.append(list.item(i).getNodeValue());52.}53.}54.55.return sb.toString();56.}57.}来源:清源教育。