SAX(Simple API for XML),是指一种接口,或者一个软件包。
DOM:文档驱动。DOM在解析文件之前把整个文档装入内存,处理大型文件时其性能很差,是由于DOM的树结构所造成的,此结构占用的内存较多。
SAX:事件驱动型的XML解析方式。顺序读取XML文件,不需要一次全部装载整个文件。当遇到像文件开头,文档结束,或者标签开头与标签结束时,会触发一个事件,用户通过在其回调事件中写入处理代码来处理XML文件,适合对XML的顺序访问,且是只读的。
由于移动设备的内存资源有限,SAX的顺序读取方式更适合移动开发。
SAX解析XML步骤 ①创建XML解析处理器。 ②创建SAX解析器。 ③将XML解析处理器分配给解析器。 ④对文档进行解析,将每个事件发送给处理器。
下面是SAX解析XML文件的代码程序,完整代码下载地址:android_sax.rar
MainActivity:
-
-
- *
- *@authorzuolongsnail
- */
- publicclassMainActivityextendsActivity{
- privateButtonparseBtn;
- privateListViewlistView;
- privateArrayAdapter<Person>adapter;
- privateArrayList<Person>persons;
-
- @Override
- voidonCreate(BundlesavedInstanceState){
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- parseBtn=(Button)findViewById(R.id.parse);
- listView=(ListView)findViewById(R.id.list);
- parseBtn.setOnClickListener(newOnClickListener(){
- @Override
- voidonClick(Viewv){
- persons=MainActivity.this.readXml();
- adapter=newArrayAdapter<Person>(MainActivity.this,
- android.R.layout.simple_expandable_list_item_1,persons);
- listView.setAdapter(adapter);
- }
- });
-
- privateArrayList<Person>readXml(){
- InputStreamfile=this.getClass().getClassLoader()
- .getResourceAsStream("persons.xml");
- //①创建XML解析处理器
- SAXXmlContentHandlercontentHandler=newSAXXmlContentHandler();
- try{
- //创建一个SAXParserFactory
- SAXParserFactoryfactory=SAXParserFactory.newInstance();
- //②创建SAX解析器
- SAXParserparser=factory.newSAXParser();
- //③将XML解析处理器分配给解析器
- //④对文档进行解析,将每个事件发送给处理器。
- parser.parse(file,contentHandler);
- file.close();
- }catch(Exceptione){
- e.printStackTrace();
- }
- returncontentHandler.getBooks();
- }
XML解析处理器:
*解析XML处理器
- *@authorzuolongsnail
- *
- */
- classSAXXmlContentHandlerextendsDefaultHandler{
- privateArrayList<Person>persons;
- privatePersonperson;
- privateStringtagName;
- publicArrayList<Person>getBooks(){
- returnpersons;
- voidstartDocument()throwsSAXException{
- this.persons=newArrayList<Person>();
- Log.e("SAXXmlContentHandler","开始解析XML文件");
- voidstartElement(Stringuri,StringlocalName,StringqName,248)"> Attributesattributes)throwsSAXException{
- "读取标签");
- this.tagName=localName;
- if(this.tagName.equals("person")){
- person=newPerson();
- person.setId(Integer.parseInt(attributes.getValue(0)));
- voidcharacters(char[]ch,intstart,153); font-weight:bold; background-color:inherit">intlength)
- "根据tagName获取标签的内容");
- this.tagName!=null){
- Stringdata=newString(ch,start,length);
- this.tagName.equals("name")){
- this.person.setName(data);
- }elsethis.tagName.equals("age")){
- this.person.setAge(Integer.parseInt(data));
- voidendElement(Stringuri,StringqName)
- if(localName.equals("person")){
- this.persons.add(person);
- this.tagName=null;
- }
persons.xml文件:
<?xmlversion="1.0"encoding="UTF-8"?>
- <persons>
- personid="1">
- name>张三</age>24personpersonid="2">李四>25personid="3">王五>26>
Person实体类:
copy
*Person实体类
- classPerson{
- privateintid;
- privateStringname;
- intage;
- publicPerson(){
- publicPerson(intid,Stringname,153); font-weight:bold; background-color:inherit">intage){
- this.id=id;
- this.name=name;
- this.age=age;
- intgetId(){
- returnid;
- voidsetId(intid){
- this.id=id;
- publicStringgetName(){
- returnname;
- voidsetName(Stringname){
- intgetAge(){
- returnage;
- voidsetAge(intage){
- this.age=age;
- publicStringtoString(){
- return"姓名:"+this.name+",年龄:"+this.age;
- main.xml文件:
copy
xmlversion="1.0"encoding="utf-8"LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"
- android:orientation="vertical"android:layout_width="fill_parent"
- android:layout_height="fill_parent"TextViewandroid:layout_width="fill_parent"
- android:layout_height="wrap_content"android:text="@string/hello"/>
- Buttonandroid:id="@+id/parse"android:layout_width="wrap_content"
- android:layout_height="wrap_content"android:text="SAX解析XML"ListViewandroid:id="@+id/list"android:layout_width="fill_parent"
- ListViewLinearLayout 程序运行截图:
点击解析按钮后为
(编辑:李大同)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|