一.xml介绍:
1.XML:Extensible Markup Language,即可扩展标记语言. 用于标记电子文件使其具有结构性的标记语言,可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言。非常适合 Web 传输。XML 提供统一的方法来描述和交换独立于应用程序或供应商的结构化数据.
2. XML和Json都可以在网络传输中使用的。现在主要是使用Json传输.
3. 两者比较:
A,可读性来说,XML有明显的优势,毕竟人类的语言更贴近这样的说明结构。JSON读起来更像一个数据块,但读起来就比较费解了。
B,传输效率上来说,JSON更为清晰且冗余更少些。JSON网站提供了对JSON语法的严格描述,只是描述较简短。
从总体来看,XML比较适合于标记文档(配置工程),而JSON却更适于进行数据交换的处理。
C,编码难度XML有丰富的编码工具,比如Dom4j、JDom等,JSON也有json.org提供的工具,但是JSON的编码明显比XML容易许多,即使不借助工具也能写出JSON的代码,可是要写好XML就不太容易了。
二.Xml解析:
1.PULL
Pull 内置于 Android 系统中。也是官方解析布局文件所使用的方式。Pull 与 SAX 有点类似,都提供了类似的事件,如开始元素和结束元素。
不同的是,SAX 的事件驱动是回调相应方法,需要提供回调的方法,而后在 SAX 内部自动调用相应的方法。
而Pull解析器并没有强制要求提供触发的方法。因为他触发的事件不是一个方法,而是一个数字。它使用方便,效率高。
2.SAX
SAX(Simple API for XML) 使用流式处理的方式,它并不记录所读内容的相关信息。它是一种以事件为驱动的XML API,解析速度快,占用内存少。使用回调函数来实现。缺点是不能倒退。
3.DOM
DOM(Document Object Model) 是一种用于XML文档的对象模型,可用于直接访问 XML 文档的各个部分。它是一次性全部将内容加载在内存中,生成一个树状结构,它没有涉及回调和复杂的状态管理。
缺点是加载大文档时效率低下。
4.SAX、DOM、Pull三种解析方式的比较
内存占用:SAX、Pull比DOM要好;
编程方式:SAX 采用事件驱动,在相应事件触发的时候,会调用用户编好的方法,也即每解析一类 XML,就要编写一个新的适合该类XML的处理类。DOM 是 W3C 的规范,Pull 简洁。
访问与修改:SAX 采用流式解析,DOM 随机访问。
访问方式:SAX,Pull 解析的方式是同步的,DOM 逐字逐句。
//要解析的xml文件 带空格的
<?xml version="1.0" encoding="UTF-8" ?>
<students>
<student>
<name age="19" sex="man">
刘瑞
</name>
<love>
嘻嘻
</love>
</student>
<student>
<name age="19" sex="man">
刘大瑞
</name>
<love>
哈哈
</love>
</student>
<student>
<name age="19" sex="man">
刘小瑞
</name>
<love>
拉拉
</love>
</student>
<student>
<name age="19" sex="man">
帅刘瑞
</name>
<love>
嘿嘿
</love>
</student>
</students>
//Dom解析
public class DomUtils {
public static ArrayList<student> getStudents(InputStream inputStream) throws ParserConfigurationException, IOException, SAXException {
ArrayList<student> list=new ArrayList<>();
DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
Document parse = documentBuilder.parse(inputStream);
NodeList nodeList = parse.getElementsByTagName("student");
for (int i=0;i<nodeList.getLength();i++){
Node item = nodeList.item(i);
student student=new student();
NodeList childNodes = item.getChildNodes();
for (int j=0;j<childNodes.getLength();j++){
Node node = childNodes.item(j);
if (node.getNodeName().equals("name")){
student.setName(node.getTextContent().trim());
NamedNodeMap attributes = node.getAttributes();
String sex = attributes.getNamedItem("sex").getNodeValue();
String age = attributes.getNamedItem("age").getNodeValue();
student.setSex(sex);
student.setAge(age);
}else if (node.getNodeName().equals("love")){
student.setLove(node.getTextContent().trim());
}
}
list.add(student);
}
return list;
}
}
//Pull解析
public class PullUtils {
public static ArrayList<student> getStudents(InputStream inputStream){
ArrayList<student> arrayList=new ArrayList<>();
try {
XmlPullParserFactory xmlPullParserFactory = XmlPullParserFactory.newInstance();
XmlPullParser xmlPullParser = xmlPullParserFactory.newPullParser();
xmlPullParser.setInput(inputStream,"UTF-8");
int eventType = xmlPullParser.getEventType();
student stu=null;
while (eventType!=xmlPullParser.END_DOCUMENT){
if (eventType==xmlPullParser.START_TAG){
if ("student".equals(xmlPullParser.getName())){
stu=new student();
}else if ("name".equals(xmlPullParser.getName())){
String age = xmlPullParser.getAttributeValue(0);
String sex = xmlPullParser.getAttributeValue(1);
stu.setAge(age);
stu.setSex(sex);
stu.setName(xmlPullParser.nextText().trim());
}else if ("love".equals(xmlPullParser.getName())){
stu.setLove(xmlPullParser.nextText().trim());
}
}else if (eventType==xmlPullParser.END_TAG){
if ("student".equals(xmlPullParser.getName())){
arrayList.add(stu);
}
}
int next = xmlPullParser.next();
eventType=next;
}
} catch (XmlPullParserException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return arrayList;
}
}
//SaxUtils
public class SaxUtils {
private static ArrayList<student> arrayList=new ArrayList<>();
public static ArrayList<student> getStudents(InputStream inputStream) throws ParserConfigurationException, SAXException, IOException {
SAXParserFactory saxParserFactory = SAXParserFactory.newInstance();
SAXParser saxParser = saxParserFactory.newSAXParser();
saxParser.parse(inputStream,new MySaxHelp());
return arrayList;
}
static class MySaxHelp extends DefaultHandler{
student student;
String s;
String name;
StringBuffer namebuffer;
StringBuffer lovebuffer;
@Override
public void startDocument() throws SAXException {
super.startDocument();
}
@Override
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
super.startElement(uri, localName, qName, attributes);
if (qName.equals("student")){
student=new student();
}else if (qName.equals("name")){
String age = attributes.getValue(0);
String sex = attributes.getValue(1);
student.setAge(age);
student.setSex(sex);
}
name=qName;
namebuffer=new StringBuffer();
lovebuffer=new StringBuffer();
}
@Override
public void characters(char[] ch, int start, int length) throws SAXException {
super.characters(ch, start, length);
s = new String(ch, start, length);
if ("name".equals(name)){
namebuffer.append(s);
}else if ("love".equals(name)){
lovebuffer.append(s);
}
}
@Override
public void endElement(String uri, String localName, String qName) throws SAXException {
super.endElement(uri, localName, qName);
if (qName.equals("student")){
arrayList.add(student);
}else if (qName.equals("name")){
String string = namebuffer.toString();
student.setName(string.trim());
}else if (qName.equals("love")){
String string = lovebuffer.toString();
student.setLove(string.trim());
}
}
@Override
public void endDocument() throws SAXException {
super.endDocument();
}
}
}
//bean类
public class student {
private String name;
private String age;
private String sex;
private String love;
public student(String name, String age, String sex, String love) {
this.name = name;
this.age = age;
this.sex = sex;
this.love = love;
}
public student() {
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public String getLove() {
return love;
}
public void setLove(String love) {
this.love = love;
}
@Override
public String toString() {
return "student{" +
"name='" + name + '\'' +
", age='" + age + '\'' +
", sex='" + sex + '\'' +
", love='" + love + '\'' +
'}';
}
}
//调用三种xml解析的方法
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
try {
InputStream inputStream = getAssets().open("students.xml");
ArrayList<student> students = PullUtils.getStudents(inputStream);
Log.e("###","Pull解析:"+students.toString());
} catch (IOException e) {
e.printStackTrace();
}
try {
InputStream inputStream = getAssets().open("students.xml");
ArrayList<student> students = SaxUtils.getStudents(inputStream);
Log.e("###","Sax解析:"+students.toString());
} catch (IOException e) {
e.printStackTrace();
} catch (SAXException e) {
e.printStackTrace();
} catch (ParserConfigurationException e) {
e.printStackTrace();
}
try {
InputStream inputStream = getAssets().open("students.xml");
ArrayList<student> students = DomUtils.getStudents(inputStream);
Log.e("###","Dom解析:"+students.toString());
} catch (IOException e) {
e.printStackTrace();
} catch (SAXException e) {
e.printStackTrace();
} catch (ParserConfigurationException e) {
e.printStackTrace();
}
}
}