JAVA 中XML的解析
XML: 可扩展标记语言(extensible Markup Language)
用于标记电子文件使其具有结构性的标记语言。XML可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言。
xml语言示例:
<?xml version ="1.0" encoding="utf-8" ?> =》》这个必须要有
<persons>
<person id="01">
<name>李鹏</name>
<age>22</age>
<sex>男</sex>
</person>
<person id="02">
<name>李四</name>
<age>23</age>
<sex>女</sex>
</person>
</persons>
xml的解析方法:
1:SAX解析
MyHandler类,负责解析xml文档将查找的值使用面向对象思想放在对象列表中==》必须要继承DefaultHandler类
package sax; import java.util.ArrayList; import java.util.List; import org.xml.sax.Attributes; import org.xml.sax.SAXException; import org.xml.sax.helpers.DefaultHandler; public class MyHandler extends DefaultHandler { private List<Person> list; private Person person; private String tagName;//存储开始标签名字 //解析到文档开头时,执行该方法 @Override public void startDocument() throws SAXException { list = new ArrayList<Person>(); } //解析到开始标签时,执行该方法,qName参数用来接收标签名字 @Override public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { tagName = qName; if("person".equals(qName)) { person = new Person(); if(attributes !=null) { //解析标签中的内容 如:<person id="01"> 中的id for(int i =0;i<attributes.getLength();i++) { String name = attributes.getQName(i); String value = attributes.getValue(i); if("id".equals(name)) { person.setId(Integer.parseInt(value)); } } } } } //解析到标签内容时,执行该方法,解析到的标签内容传给了参数ch @Override public void characters(char[] ch, int start, int length) throws SAXException { String str = new String(ch,start,length); if("name".equals(tagName)) person.setName(str); else if("age".equals(tagName)) person.setAge(Integer.parseInt(str)); else if("sex".equals(tagName)) person.setSex(str); } //解析到结束标签时,执行该方法,qName接收标签名称 @Override public void endElement(String uri, String localName, String qName) throws SAXException { tagName = null;//这里必须置空 if("person".equals(qName)) { list.add(person); } } //解析到文档结束时,执行该方法 @Override public void endDocument() throws SAXException { } public List<Person> getList() { return list; } }
Test类:负责建立解析器,建立解析器使用的读取类和读取流,读取到数据并显示在客户端,其中的HttpUtil类在上篇博客中有
package sax; import java.io.IOException; import java.io.InputStream; import java.util.List; import javax.xml.parsers.ParserConfigurationException; import javax.xml.parsers.SAXParser; import javax.xml.parsers.SAXParserFactory; import org.xml.sax.SAXException; public class Test { public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException { //创建Sax解析工厂对象 SAXParserFactory factory = SAXParserFactory.newInstance(); //创建Sax解析器对象---具备解析功能的对象 SAXParser parser = factory.newSAXParser(); String path = "http://localhost:9999/day16/user2.xml"; //创建被解析的文件的读取流 InputStream in = HttpUtil.getInputStram(path); //创建MyHandler对象 MyHandler handler = new MyHandler(); //解析器使用文件字节读取流读取文件,读取的过程中调用handler中的方法 parser.parse(in,handler); //获取集合 List<Person> list = handler.getList(); for(Person per:list) { System.out.println(per); } } }
2:PULL解析 ==》直接返回解析得到的list列表
package PULL; import java.io.IOException; import java.io.InputStream; import java.net.HttpURLConnection; import java.net.URL; import java.util.ArrayList; import java.util.List; import org.xmlpull.v1.XmlPullParser; import org.xmlpull.v1.XmlPullParserException; import org.xmlpull.v1.XmlPullParserFactory; public class Pull { public static List<Person> pullParser(InputStream in) throws XmlPullParserException, NumberFormatException, IOException { List<Person> list = null; Person person = null; //创建pull解析工厂类对象 XmlPullParserFactory factory = XmlPullParserFactory.newInstance(); //创建pull解析器对象 XmlPullParser parser = factory.newPullParser(); //创建被解析文件的读取流对象 InputStream input = in; parser.setInput(input,"utf-8"); //把被解析的文件的读取流给解析器 //得到解析器返回的第一个编号 int event = parser.getEventType(); while (event != XmlPullParser.END_DOCUMENT) { switch (event) { case XmlPullParser.START_DOCUMENT: list = new ArrayList<Person>(); break; case XmlPullParser.START_TAG: //得到解析到的标签名 String tagName = parser.getName(); if ("person".equals(tagName)) { person = new Person(); int count = parser.getAttributeCount(); for (int i = 0; i < count; i++) { //直接得到开始标签后边的数据 String attrName = parser.getAttributeName(i); String attrValue = parser.getAttributeValue(i); if ("id".equals(attrName)) person.setId(Integer.parseInt(attrValue)); } } else if ("age".equals(tagName)) person.setAge(Integer.parseInt(parser.nextText())); else if ("sex".equals(tagName)) person.setSex(parser.nextText()); else if("name".equals(tagName)) person.setName(parser.nextText()); break; case XmlPullParser.END_TAG: if ("person".equals(parser.getName())) list.add(person); break; } //得到下一个编号 event = parser.next(); } return list; } }