关于解析XML主要介绍三种方式,DOM,SAX,Pull 在Android优先使用SAX解析,PC一般使用DOM解析,因为DOM解析XML是吧整个XML加载到内存中,快,单占用内存。(Android 能省一点是一点)
<?xml version="1.0" encoding="UTF-8"?>
<persons>
<person id = "23">
<name>张老师</name>
<age>21</age>
</person>
<person id = "20">
<name>李老师</name>
<age>25</age>
</person>
</persons>
这是我们今天要解析的XML
SAX解析XML
没什么好说的解析XML 直接上代码
public static void main(String[] args) {
SAXParserFactory factory = SAXParserFactory.newInstance();
try {
SAXParser parser = factory.newSAXParser();
SAXParserHandle handle = new SAXParserHandle();
parser.parse("demo.xml", handle);
} catch (ParserConfigurationException e) {
e.printStackTrace();
} catch (SAXException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
值得一说的就是SAXParserHandle,这个是自己创建的一个类继承与DefaultHandler
public class SAXParserHandle extends DefaultHandler {
@Override
public void startDocument() throws SAXException {
// TODO Auto-generated method stub
super.startDocument();
System.out.println("----解析开始----");
}
@Override
public void endDocument() throws SAXException {
// TODO Auto-generated method stub
super.endDocument();
System.out.println("----解析结束----");
}
@Override
public void startElement(String arg0, String arg1, String name,
Attributes attributes) throws SAXException {
// TODO Auto-generated method stub
super.startElement(arg0, arg1, name, attributes);
if(name.equals("person")){
System.out.println("==========开始遍历某一项的内容==========");
int length = attributes.getLength();
for(int i=0;i<length;i++){
System.out.print("属性:"+attributes.getQName(i));
System.out.println("---值:"+attributes.getValue(i));
}
}else if(!name.equals("person") && !name.equals("persons")){
System.out.print("节点:"+ name);
}
}
@Override
public void endElement(String arg0, String arg1, String name)
throws SAXException {
// TODO Auto-generated method stub
super.endElement(arg0, arg1, name);
if(name.equals("person")){
System.out.println("==========结束遍历某一项的内容==========");
}
}
@Override
public void characters(char[] ch, int start, int length) throws SAXException {
// TODO Auto-generated method stub
super.characters(ch, start, length);
String nodeValue = new String(ch, start, length);
if(!nodeValue.trim().equals("")){
System.out.println("值:"+nodeValue);
}
}
}
继承完DefaultHandler之后重写几个方法,解析开始前执行的,结束后执行的,循环解析属性,结束循环的,循环解析值的。
PULL解析XML
利用Pull解析XML要导入Pull,jar包http://download.csdn.net/download/ttnuli/8080605 我贴出下载包,感谢CSDN某楼主分享
public static void main(String[] args) {
try {
XmlPullParserFactory xpf = XmlPullParserFactory.newInstance();//构造工厂实例
XmlPullParser parser = xpf.newPullParser();//创建解析对象
// 设置需要解析的XML数据
File file =new File("C://Users//Administrator//workspace//yanhao//XML//demo.xml");
InputStream inStream=new FileInputStream(file);
parser.setInput(inStream, "UTF-8");
// 取得事件
int event = parser.getEventType();
// 开始解析
while (event != XmlPullParser.END_DOCUMENT){// 文档结束
// 节点名称
String nodeName = parser.getName();
switch (event){
case XmlPullParser.START_DOCUMENT: // 文档开始
System.out.println("开始解析");
break;
case XmlPullParser.START_TAG: // 标签开始
if ("person".equals(nodeName)){
String id = parser.getAttributeValue(0);
System.out.println("id="+id);
}
if ("name".equals(nodeName)){
String name = parser.nextText();
System.out.println("name="+name);
}
if ("age".equals(nodeName)){
int age = Integer.valueOf(parser.nextText());
System.out.println("age="+age);
}
break;
case XmlPullParser.END_TAG: // 标签结束
if ("person".equals(nodeName)){
System.out.println("解析结束");
}
break;
}
event = parser.next(); // 下一个标签
}
} catch (XmlPullParserException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
SAX解析XML文件的方式大致相同,他们都是基于事件驱动的。XmlPull和Sax类似,是基于流(stream)操作文件,然后根据节点事件回调开发者编写的处理程序。因为是基于流的处理,因此Xmlpull和Sax都比较节约内存资源,不会象Dom那样要把所有节点以对橡树的形式展现在内存中。
DOM解析XML
Dom解析是将xml文件全部载入,组装成一颗dom树,然后通过节点以及节点之间的关系来解析xml文件。
public static void main(String[] args) {
try {
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();;
File file =new File("C://Users//Administrator//workspace//yanhao//XML//demo.xml");
InputStream inStream=new FileInputStream(file);
Document document = builder.parse(inStream);
Element element = document.getDocumentElement();
NodeList personNodes = element.getElementsByTagName("person");
for(int i=0;i<personNodes.getLength();i++){
Element personElement = (Element) personNodes.item(i);
System.out.println("id="+personElement.getAttribute("id"));
NodeList childNodes = personElement.getChildNodes();
for(int j=0;j<childNodes.getLength();j++){
if(childNodes.item(j).getNodeType()==Node.ELEMENT_NODE){
if("name".equals(childNodes.item(j).getNodeName())){
System.out.println("name="+childNodes.item(j).getFirstChild().getNodeValue());
}else if("age".equals(childNodes.item(j).getNodeName())){
System.out.println("age="+Float.parseFloat(childNodes.item(j).getFirstChild().getNodeValue()));
}
}
}
}
} catch (ParserConfigurationException e) {
e.printStackTrace();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (SAXException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
值得一说的就是DOM解析配置文件还行,但是不要解析太大的数据。不然会吃不消的.....