Android(安卓)Xml解析
学习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();
当遇到文档的开头的时候调用这个方法,可以在其中做一些预处理的工作
2:endDocument();
和1想对应,在其中可以做一些善后的处理
3:startElement(String namespaceURI, String localName, String qName, Attributes atts)
namespaceURI命名空间(如:<jsp:include>中的jsp)
localName不带命名空间的前缀标签名 (如:<jsp:include>中的include)
qName: 带命名空间的前缀标签名 (如:<jsp:include>中的jsp:include)
atts可以通过其得到所有属性与值
4:endElements(String url, String localName, String name)
与3对应,不同的是在结束标签的时候进行调用
5:characters(char[] ch, int start, int length)—文本Node事件
用于处理在xml文件中读到的内容,第一个参数为文件的字符串内容,后面两个参数是读到的字符串在这个数组的起始位置和长度,使用newString(ch,start,length)就可以得到内容
实现步骤:
1:SAXParserFactory factory = SAXParserFactory.newInstance();
SAXParser parser = factory.newSAXParser();
Parser.parse(inputStream,handler);
2实现handler
步骤:
1:extends 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>
实现步骤:
1:public 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考虑的内存方面的问题,所以一般使用内部类)进行实现;
其中重写一下几个方法:
1:startElement() endElement() startDocument() Characters()
2:然后就是不同的事件进行不同的处理
PULL(直接通过Xml得到对象):parser为解析对象;主要得到一个EventType():事件类型
根据这个时间类型在最后做循环:Tag = parser.next();
元素操作:1:得到节点名—parser.getName();
2:得到节点内容(Text)parser.nextText();
3:得到节点中属性的值:parser.getAttributeValue(index);
更多相关文章
- 02相对布局
- Android(安卓)强制设置应用横屏或竖屏
- Android(安卓)-- 获取IP和MAC地址
- Android中得到布局文件对象三种方式
- 自定义一个dialog没有标题
- Android(安卓)TransitionManager源码解析
- Android(安卓)Bitmap Drawable byte[] InputStream 相互转换方法
- 解析底层原理!月薪20k+的Android面试都问些什么?深夜思考
- 深刻解析 Android(安卓)的 AIDL