Android的sax解析xml

本文介绍了一种基于SAX的XML解析方法,并提供了一个具体的Android应用程序案例。该应用能够读取XML文件并将其内容显示在列表视图中,适用于移动设备上的XML文件处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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:

[java] view plaincopy
/**
* MainActivity
*
* @author zuolongsnail
*
*/
public class MainActivity extends Activity {
private Button parseBtn;
private ListView listView;
private ArrayAdapter adapter;
private ArrayList persons;

@Override  
public void onCreate(Bundle savedInstanceState) {  
    super.onCreate(savedInstanceState);  
    setContentView(R.layout.main);  
    parseBtn = (Button) findViewById(R.id.parse);  
    listView = (ListView) findViewById(R.id.list);  
    parseBtn.setOnClickListener(new OnClickListener() {  
        @Override  
        public void onClick(View v) {  
            persons = MainActivity.this.readXml();  
            adapter = new ArrayAdapter<Person>(MainActivity.this,  
                    android.R.layout.simple_expandable_list_item_1, persons);  
            listView.setAdapter(adapter);  
        }  
    });  
}  

private ArrayList<Person> readXml() {  
    InputStream file = this.getClass().getClassLoader()  
            .getResourceAsStream("persons.xml");  
    // ①创建XML解析处理器  
    SAXXmlContentHandler contentHandler = new SAXXmlContentHandler();  
    try {  
        // 创建一个SAXParserFactory  
        SAXParserFactory factory = SAXParserFactory.newInstance();  
        // ②创建SAX解析器  
        SAXParser parser = factory.newSAXParser();  
        // ③将XML解析处理器分配给解析器  
        // ④对文档进行解析,将每个事件发送给处理器。  
        parser.parse(file, contentHandler);  
        file.close();  

    } catch (Exception e) {  
        e.printStackTrace();  
    }  
    return contentHandler.getBooks();  
}  

}

XML解析处理器:

[java] view plaincopy
/**
* 解析XML处理器
* @author zuolongsnail
*
*/
public class SAXXmlContentHandler extends DefaultHandler {

private ArrayList<Person> persons;  
private Person person;  
private String tagName;  

public ArrayList<Person> getBooks() {  
    return persons;  
}  

@Override  
public void startDocument() throws SAXException {  
    this.persons = new ArrayList<Person>();  
    Log.e("SAXXmlContentHandler", "开始解析XML文件");  
}  

@Override  
public void startElement(String uri, String localName, String qName,  
        Attributes attributes) throws SAXException {  
    Log.e("SAXXmlContentHandler", "读取标签");  
    this.tagName = localName;  
    if(this.tagName.equals("person")){  
        person = new Person();  
        person.setId(Integer.parseInt(attributes.getValue(0)));  
    }  
}  
@Override  
public void characters(char[] ch, int start, int length)  
        throws SAXException {  
    Log.e("SAXXmlContentHandler", "根据tagName获取标签的内容");  
    if (this.tagName != null) {  
        String data = new String(ch, start, length);  
        if (this.tagName.equals("name")) {  
            this.person.setName(data);  
        } else if (this.tagName.equals("age")) {  
            this.person.setAge(Integer.parseInt(data));  
        }  
    }  
}  
@Override  
public void endElement(String uri, String localName, String qName)  
        throws SAXException {  
    if(localName.equals("person")){  
        this.persons.add(person);  
    }  
    this.tagName = null;  
}  

}
persons.xml文件:

[xhtml] view plaincopy

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值