1)dom: 文档对象模型(Document Object Model) 官方推荐的标准
dom原理:会把我们要解析的整个xml加载到到内存中.在内存中形成一个树形结构
优点:可以进行增删改查
缺点:由于把整个文档加载到内存中.所以会造成内存泄露
2)sax: 简单应用程序接口(Simple Api For Xml) 他不是官方推荐 是一个程序员社区研究出来
特点:一边解析 一边处理 一边释放内存
优点:不会有内存泄露
缺点: 不能进行增 删 改
3)xmlpull解析:他是Android中内置的解析器,解析原理类似sax
1、dom解析实现
dom sax xmlpull只是三种解析的方式 或者说是解析的思想,他并没有提供相应的api实现
sun公司提供了一套接口jaxp Java API for XML Processing 实现了dom 和 sax解析
dom解析会形成一个树形结构
dom解析把xml元素 属性 文本都当成是节点(node)
实现思路:通过工厂获取解析器的实例 拿到解析器的实例后解析xml
具体实现步骤:
//[1]定义工厂
DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
//[2]通过工厂获取解析器
DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
//[3]开始解析xml document代表整棵树
Document document = documentBuilder.parse("bookstore.xml");
//[4]获取我们想获取的内容
NodeList elementsByTagNames = document.getElementsByTagName("name");
//[5]循环取出集合中每个节点
for(int i=0;i<elementsByTagNames.getLength();i++){
//[6]取出每个item5.
Node item = elementsByTagNames.item(i);
String content = item.getFirstChild().getTextContent();
//[7]取出书的名字
System.out.println("content:"+content);
}
2、sax解析实现
dom特点把整个文档加载到内存 sax思想是一边解析一边处理一边释放内存
具体实现代码步骤如下
//[1]构建工厂
SAXParserFactory saxParserFactory = SAXParserFactory.newInstance();
//[2]通过工厂获取sax解析器
SAXParser saxParser = saxParserFactory.newSAXParser();
//[3]开始解析xml 第二个参数是事件的处理器
saxParser.parse("bookstore.xml", new MyDefaultHandler());
}
//定义事件的处理器
class MyDefaultHandler extends DefaultHandler{
// 接收文档开始的通知。
@Override
public void startDocument() throws SAXException {
super.startDocument();
System.out.println("文档开始");
}
// 接收元素开始的通知。
@Override
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException {
super.startElement(uri, localName, qName, attributes);
System.out.println("startElement");
}
//接收元素中字符(文本)数据的通知
@Override
public void characters(char[] ch, int start, int length)
throws SAXException {
super.characters(ch, start, length);
String content = new String(ch, start, length);
if (content!=null&&content.trim().length()>0) {
System.out.println("characters--文本"+content);
}
}
//接收元素结束的通知。
@Override
public void endElement(String uri, String localName, String qName)
throws SAXException {
super.endElement(uri, localName, qName);
System.out.println("endElement");
}
//接收文档结束的通知。
@Override
public void endDocument() throws SAXException {
super.endDocument();
System.out.println("文档结束");
}
}
3、xmlpull解析的实现
原理:类似sax 一边解析 一边处理 它是Android内置的解析器
//代码的实现
[1]导入xmlpullparser相关的jar包
[2]具体的代码实现
//[0]创建一个集合
List<Book> lists = null;
Book book = null;
//[1]构建工厂
XmlPullParserFactory xmlPullParserFactory = XmlPullParserFactory.newInstance();
//[2]通过工厂获取 xmlpullparser解析器
XmlPullParser parser = xmlPullParserFactory.newPullParser();
//[3]开始解析xml arg1编码的方式
parser.setInput(new FileInputStream("bookstore.xml"), "utf-8");
//[4]获取解析的事件类型
int eventType = parser.getEventType(); //代表解析到了文档的开头
//[5]不到文件的结尾就一直解析
while(eventType!=XmlPullParser.END_DOCUMENT){
switch (eventType) {
case XmlPullParser.START_TAG: //代表解析的开始标签
//[6]具体判断一下解析到了哪个开始标签
if("bookstore".equals(parser.getName())){
//[7]创建list集合
lists= new ArrayList<Book>();
}else if("book".equals(parser.getName())){
//[8]创建javabean对象
book = new Book();
//[9]获取id的属性 getAttributeValue 获取开始标签的一个属性值
String id = parser.getAttributeValue(0);
book.setId(id);
}else if("name".equals(parser.getName())){
//pull解析注意获取标签包裹的内容则是 使用 .NextText()
//而不是使用getText();
String name = parser.nextText();
book.setName(name);
}else if("price".equals(parser.getName())){
String price = parser.nextText();
book.setPrice(price);
}
break;
case XmlPullParser.END_TAG: //代表解析的结束的标签
if("book".equals(parser.getName())){
//把book对象加入到list集合中
lists.add(book);
}
break;
}
//获取下一个标签的类型
eventType = parser.next();
//[6]一直解析
}
//最后一步 打印一下集合的信息
for (Book l : lists) {
System.out.println("l~~~"+l);
}