学习Android的朋友欢迎加入:群 59324839(QQ)

XML文件解析

Xml文件解析

SAX(事件驱动)//1:Element Node 2:text Node

<?xml version="1.0" encoding="UTF-8" ?> --(start document)--1

<persons>-------------------------------------(start Element)------2

<person>

<person id="23">

<name>liming</name>

<age>30</age>

</person>

<person>

<person id="20">

<name>lixiangmei</name>

<age>25</age>

</person>

</persons>

说明:事件驱动---流式处理

1:startDocutment();

当遇到文档的开头的时候调用这个方法,可以在其中做一些预处理的工作

2endDocument();

1想对应,在其中可以做一些善后的处理

3startElement(String namespaceURI, String localName, String qName, Attributes atts)

namespaceURI命名空间(如:<jsp:include>中的jsp

localName不带命名空间的前缀标签名 (如:<jsp:include>中的include)

qName: 带命名空间的前缀标签名 (如:<jsp:include>中的jsp:include)

atts可以通过其得到所有属性与值

4endElements(String url, String localName, String name)

3对应,不同的是在结束标签的时候进行调用

5characters(char[] ch, int start, int length)—文本Node事件

用于处理在xml文件中读到的内容,第一个参数为文件的字符串内容,后面两个参数是读到的字符串在这个数组的起始位置和长度,使用newStringch,start,length)就可以得到内容

实现步骤:

1SAXParserFactory factory = SAXParserFactory.newInstance();

SAXParser parser = factory.newSAXParser();

Parser.parse(inputStream,handler);

2实现handler

步骤:

1extends DefaultHandler(list tag)

重写:[1]characters [2]startDoucment [3]startElement [4]endElement

DOM(文件树内存消耗大)

优点:xml代码直观,

<?xml version="1.0" encoding="UTF-8" ?> --(start document)--1

<persons>-------------------------------------(start Element)------2

<person>

<person id="23">

<name>liming</name>

<age>30</age>

</person>

<person>

<person id="20">

<name>lixiangmei</name>

<age>25</age>

</person>

</persons>

实现步骤:

1public static List<Person> getPersons(InputStream inStream) throws Throwable{

List<Person> persons = new ArrayList<Person>();

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();

DocumentBuilder builder = factory.newDocumentBuilder();

Document documnet = builder.parse(inStream);

Element root = documnet.getDocumentElement();

NodeList personNodes = root.getElementsByTagName("person");

for(int i=0 ; i < personNodes.getLength(); i++){

Person person = new Person();

Element personElement = (Element)personNodes.item(i);

person.setId(new Integer(personElement.getAttribute("id")));

NodeList personChilds = personElement.getChildNodes();

for(int y=0 ; y < personChilds.getLength(); y++){

if(personChilds.item(y).getNodeType()==Node.ELEMENT_NODE){//判断当前节点是否是元素类型节点

Element childElement = (Element)personChilds.item(y);

if("name".equals(childElement.getNodeName())){

person.setName(childElement.getFirstChild().getNodeValue());

}else if("age".equals(childElement.getNodeName())){

person.setAge(new Short(childElement.getFirstChild().getNodeValue()));

}

}

}

persons.add(person);

}

return persons;

}

PULL解析

public static List<Person> getPersons(InputStream inStream) throws Throwable{

List<Person> persons = null;

Person person = null;

XmlPullParser parser = Xml.newPullParser();

parser.setInput(inStream, "UTF-8");

int eventType = parser.getEventType();//产生第一个事件

while(eventType!=XmlPullParser.END_DOCUMENT){//只要不是文档结束事件

switch (eventType) {

case XmlPullParser.START_DOCUMENT:

persons = new ArrayList<Person>();

break;

case XmlPullParser.START_TAG:

String name = parser.getName();//获取解析器当前指向的元素的名称

if("person".equals(name)){

person = new Person();

person.setId(new Integer(parser.getAttributeValue(0)));

}

if(person!=null){

if("name".equals(name)){

person.setName(parser.nextText());//获取解析器当前指向元素的下一个文本节点的值

}

if("age".equals(name)){

person.setAge(new Short(parser.nextText()));

}

}

break;

case XmlPullParser.END_TAG:

if("person".equals(parser.getName())){

persons.add(person);

person = null;

}

break;

}

eventType = parser.next();

}

return persons;

}

Xml文件解析总结:

SAX:(通过相关Factory得到);

如:parser对象

Parser.Parser(InStream,DefaultHandler);

其中最为主要的就是这个DefaultHandler;我们通过一个内部类(由于android考虑的内存方面的问题,所以一般使用内部类)进行实现;

其中重写一下几个方法:

1startElement() endElement() startDocument() Characters()

2:然后就是不同的事件进行不同的处理

PULL(直接通过Xml得到对象):parser为解析对象;主要得到一个EventType():事件类型

根据这个时间类型在最后做循环:Tag = parser.next();

元素操作:1:得到节点名—parser.getName();

2:得到节点内容(Textparser.nextText();

3:得到节点中属性的值:parser.getAttributeValue(index);

更多相关文章

  1. 02相对布局
  2. Android(安卓)强制设置应用横屏或竖屏
  3. Android(安卓)-- 获取IP和MAC地址
  4. Android中得到布局文件对象三种方式
  5. 自定义一个dialog没有标题
  6. Android(安卓)TransitionManager源码解析
  7. Android(安卓)Bitmap Drawable byte[] InputStream 相互转换方法
  8. 解析底层原理!月薪20k+的Android面试都问些什么?深夜思考
  9. 深刻解析 Android(安卓)的 AIDL

随机推荐

  1. Android软键盘弹出将布局底部控件顶上去
  2. android -- TextView 部分字符带颜色 与
  3. Android 入门介绍
  4. 谷歌Android将更新至2.3.6 修复改进语音
  5. JS对于Android和IOS平台的点击响应的适配
  6. Android Support库百分比布局
  7. Android(安卓)8位颜色值和6位颜色值的区
  8. adb shell 命令详解 在Android中查看和管
  9. android 必读的文章- 收藏集 - 掘金
  10. Android中svg矢量图和动画的使用