Android 提供了三种解析XML的方式:SAX(Simple API XML), DOM(Document Object Model), Android推荐的Pull解析方式
三种解析XML的方式都要使用JavaBean;
现在这里列一下他们共同使用的JavaBean:
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
private int age;
private String name;
private String sex;
private String address;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
private String id;
public String getLike() {
return like;
}
public void setLike(String like) {
this.like = like;
}
private String like;
public String Usershow(){
Log.e("User", "id:"+id+" 名字:" + name + " 年龄:" + age + " 性别:" + sex + " 地址:" + address + " 个人爱好:" + like);
return "名字:" + name + " 年龄:" + age + " 性别:" + sex + " 地址:" + address + " 个人爱好:" + like;
}
下面分别介绍他们的使用:
DOM,即对象文档模型,它是将整个XML文档载入内存(所以效率较低,不推荐使用),每一个节点当做一个对象,结合代码分析。DOM实现时首先为XML文档的解析定义一组接口,解析器读入整个文档,然后构造一个驻留内存的树结构,这样代码就可以使用DOM接口来操作整个树结构。 由于DOM在内存中以树形结构存放,因此检索和更新效率会更高。但是对于特别大的文档,解析和加载整个文档将会很耗资源。 当然,如果XML文件的内容比较小,采用DOM是可行的。
工作原理:使用DOM对XML文件进行操作时,首先要解析文件,将文件分为独立的元素、属性和注释等,然后以节点树的形式在内存中对XML文件进行表示,就可以通过节点树访问文档的内容,并根据需要修改文档,编程人员通过这些方法就可以读取整个XML文档的内容、或添加、修改、删除XML文档的内容。
缺点: 一次性的完全加载整个xml文件,需要消耗大量的内存。
然后使用再获取子节点列表中的需要读取的结点。
private List xmlconvertObject(InputStream stream){
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
List lists = new ArrayList<>();
try {
DocumentBuilder builder = factory.newDocumentBuilder();
Document document = builder.parse(stream);
Element element = document.getDocumentElement();
NodeList list = element.getElementsByTagName("person");
for (int i =0;i
使用HttpURLConnection返回一个InputStream,其他和上面一样
URL url = new URL(urls);
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
InputStream stream = connection.getInputStream();
return stream;
SAX是事件驱动型XML解析的一个标准接口不会改变 SAX的工作原理简单地说就是对文档进行顺序扫描,当扫描到文档(document)开始与结束、元素(element)开始与结束、文档(document)结束等地方时通知事件处理函数,由事件处理函数做相应动作,然后继续同样的扫描,直至文档结束。
优点:解析速度快,占用内存少。非常适合在Android移动设备中使用。
缺点:不会记录标签的关系,而要让你的应用程序自己处理,这样就增加了你程序的负担。
创建SAXParserFactory类,没有提供公开的构造方法(单例模式),必须使用它的静态方法newInstance()来获得对象实例。获得SAXParser必须使用SAXParserFactory.neSAXParser()获得
SAXParserFactory factory = SAXParserFactory.newInstance();
try {
SAXParser parser = factory.newSAXParser();
MySAXHandler handler = new MySAXHandler();
parser.parse(stream,handler);
stream.close();
return handler.getperson();
} catch (ParserConfigurationException e) {
e.printStackTrace();
} catch (SAXException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return null;
和DOM方法一致,此处不讲了
内置于 Android 系统中。也是官方解析布局文件所使用的方式。Pull 与 SAX 有点类似,都提供了类似的事件,如开始元素和结束元素。不同的是,SAX 的事件驱动是回调相应方法,需要提供回调的方法,而后在 SAX 内部自动调用相应的方法。而Pull解析器并没有强制要求提供触发的方法。因为他触发的事件不是一个方法,而是一个数字。它使用方便,效率高。
**解析过程:**XML pull提供了开始元素和结束元素。当某个元素开始时,我们可以调用parsernextText从XML文档中提取所有字符数据。当解释到一个文档结束时,自动生成EndDocument事件。
优点: PULL解析器小巧轻便,解析速度快,简单易用,非常适合在Android移动设备中使用,Android系统内部在解析各种XML时也是用PULL解析器,Android官方推荐开发者们使用Pull解析技术。Pull解析技术是第三方开发的开源技术,它同样可以应用于JavaSE开发。
对于pull,只有一个关键的next()方法需要了解一下,它是用于检索下一个事件,并有五个事件,这五个分别是:
虽然说关键方法只有一个用于检索下一事件的方法next(),但是还存在一些方法也可以检索下一事件,用于不同的情况下使用,如:nextText():用于检索下一元素的文本;nextTag():用于检索下一元素的标签。
对于XmlPullParserFactory类,没有提供公开的构造方法(单例模式),必须使用它的静态方法newInstance()来获得对象实例。获得XmlPullParser必须使用XmlPullParserFactory.newPullParser()获得。
private List parseXMLByPull(InputStream stream) {
List lists = null;
Person person = null;
try {
XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
XmlPullParser parser = factory.newPullParser();
parser.setInput(stream, "utf-8");
int eventType = parser.getEventType();
while (eventType != XmlPullParser.END_DOCUMENT) {
switch (eventType) {
case XmlPullParser.START_DOCUMENT:
lists = new ArrayList();
break;
case XmlPullParser.START_TAG:
if (parser.getName().equals("person")) {
person = new Person();
String id = parser.getAttributeValue(null, "id");
person.setId(id);
} else if (parser.getName().equals("name")) {
if (person != null) {
String name = parser.nextText();
person.setName(name);
}
} else if (parser.getName().equals("age")) {
if (person != null) {
int age = parser.next();
person.setAge(age);
}
} else if (parser.getName().equals("sex")) {
if (person != null) {
String sex = parser.nextText();
person.setSex(sex);
}
} else if (parser.getName().equals("address")) {
if (person != null) {
String address = parser.nextText();
person.setAddress(address);
}
} else if (parser.getName().equals("like")) {
if (person != null) {
String like = parser.nextText();
person.setLike(like);
}
}
break;
case XmlPullParser.END_TAG:
if (parser.getName().equals("person")) {
lists.add(person);
person = null;
}
break;
}
eventType = parser.next();
}
return lists;
} catch (XmlPullParserException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
和DOM方法一致,此处不讲了