XML简介
Java的XML解析大概有四种,包括DOM、SAX、JDOM、DOM4J,其中DOM和SAX解析是基础的两种:XML 独立于计算机平台,操作系统和编程语言来表示数据,凭借其简单性、可扩展性、交互性和灵活性在计算机行业中得到了世界范围的支持与采纳,其作用主要有一下3点:
1)数据存储:XOM和数据库一样,都可以实现数据的持久化存储。两者相比,数据库提供了耿强有力的数据存储和分析能力,XML仅仅是存储数据,XML与其他数据表现形式最大的不同时它极其简单。
2)数据交换:在实际应用中,由于各个计算机所使用的操作系统,数据库不同,因此数据之间的交换想来是头疼的事情,但可以使用XML交换数据来解决这个问题,例如:可以将数据库A中的数据转换成标准的XML文件,然后数据库B再将该标准的XML文件转换成适合自己数据要求的数据,以便达到交换数据的目的。
3)数据配置:许多应用都将配置数据存储在XML文件中,使用XML配置文件可读性强,灵活性高,不用像其他应用那样要经过重新编译才能修改和维护应用。
下面我们来看看用DOM来解析XML,DOM即可看成是基于树的模型:
配置文件如下:
qizai 5 100 maomao 3 101
下面用DOM来解析一下:
package my02;import java.io.IOException;import javax.xml.parsers.DocumentBuilder;import javax.xml.parsers.DocumentBuilderFactory;import javax.xml.parsers.ParserConfigurationException;import org.w3c.dom.Document;import org.w3c.dom.Node;import org.w3c.dom.NodeList;import org.xml.sax.SAXException;public class TestDOM { public static void main(String[] args) { // 1 得到DOM解析器的工厂实例 DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); // 2 从DOM工厂获得DOM解析器 try { DocumentBuilder db = dbf.newDocumentBuilder(); // 3 解析XML文档,得到一个Document,即DOM树 Document doc = db.parse("D:/pet.xml"); // 4 得到所有pet节点列表信息 NodeList petList = doc.getElementsByTagName("dog"); // 5 轮循宠物信息 System.out.println("XML文件中的宠物初始化信息:"); for (int i = 0; i < petList.getLength(); i++) { Node pet = petList.item(i); for (Node node = pet.getFirstChild(); node != null; node = node .getNextSibling()) { if (node.getNodeType() == Node.ELEMENT_NODE) { String name = node.getNodeName(); String value = node.getFirstChild().getNodeValue(); System.out.println(name + ":" + value + "\t"); } } } } catch (ParserConfigurationException e) { e.printStackTrace(); } catch (SAXException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } }}
输出结果如下:
XML文件中的宠物初始化信息:name:qizai age:5 love:100 name:maomaoage:3 love:101
DOM有其优点:整个文档树在内存中,便于操作,支持删除、修改、重新排列等多种功能;同样它也有缺点:将整个文档调入内存,浪费时间和空间。
SAX采用的是基于时间的模型,它在解析XML文档时可以触发一系列的时间,当发现给定的tag时,它可以激活一个毁掉方法,告诉该方法制定的标签已经找到,可以在自定义的解析类中定义当事件触发时要做的事情。
SAX解析的优点:不用事先调入整个文档,若是再取值,才能取到字符数据内容,解析器代码小,适于Applet下载;缺点:不是持久的,事件过后,如没有保存数据,那么数据就丢了,无状态性,从时间中只能得到文本,但不知道文本属于哪个元素,只需XML文档的少量内容,很少回头访问,机器内存少。
下面看一个例子:XML同样用上面的例子的
首先需建立一个Pet的实体类,下面是解析类
package my02;import java.io.IOException;import java.util.ArrayList;import java.util.List;import javax.xml.parsers.ParserConfigurationException;import javax.xml.parsers.SAXParser;import javax.xml.parsers.SAXParserFactory;import org.xml.sax.Attributes;import org.xml.sax.SAXException;import org.xml.sax.helpers.DefaultHandler;public class SaxParseXML extends DefaultHandler{ private Listlist = null; private Pet pet = null; private String preTagName = null; /* * 获得pet集合的方法 */ public List getPet(String fileURL) throws SAXException, IOException, ParserConfigurationException{ //获得sax解析器工厂 SAXParserFactory factory = SAXParserFactory.newInstance(); //从工厂创建sax解析器 SAXParser parser = factory.newSAXParser(); //将指定的资源标识符(URL)描述的内容解析为XML parser.parse(fileURL, this); //返回pet集合 return this.list; } /* * 开始文档解析所调用的方法 */ public void startDocument() throws SAXException{ System.out.println("开始解析文档!"); list = new ArrayList (); } public void startElement(String url,String localName,String qName,Attributes attributes)throws SAXException{ System.out.println(qName); if("dog".equals(qName)){ pet = new Pet(); String id = attributes.getValue("id"); pet.setId(Integer.parseInt(id)); } preTagName = qName; } public void endEliment(String url,String localName,String qName)throws SAXException{ if("dog".equals(qName)){ list.add(pet); pet = null; } preTagName = null; } public void characters(char[] ch,int start,int length)throws SAXException{ if("name".equals(preTagName)){ String content = new String(ch,start,length); pet.setName(content); }else if("age".equals(preTagName)){ String content = new String(ch,start,length); pet.setAge(content); }else if("love".equals(preTagName)){ String content = new String(ch,start,length); pet.setLove(content); } } public void endDocument(){ System.out.println("解析文档结束!"); } }
测试以上代码得出:
package my02;import java.io.IOException;import java.util.List;import javax.xml.parsers.ParserConfigurationException;import org.xml.sax.SAXException;public class SaxParseXMLTest { public static void main(String[] args) throws SAXException, IOException, ParserConfigurationException { SaxParseXML sax = new SaxParseXML(); String fileURL = "D:\\pet.xml"; Listlist = sax.getPet(fileURL); for(Pet pet : list){ System.out.println(pet); } }}输出:开始解析文档!petdognameagelovedognameagelove解析文档结束!
Xml文件中也可写成JSON形式的,如下所示,格式更加清楚,利于读取,如下所示:
{"name":"张飞","age":20,"address":{"city":"哈尔滨","street":"和兴路"}}
下面看一个JSON的使用方法:
{ "name":"张飞", "age":20, "address":{"city":"哈尔滨","street":"和兴路"} } 下面看一个JSON的使用方法: package day15.json; import org.json.JSONObject; public class TestJson { public static void main(String[] args) throws Exception { String strJson = getJson(); parseJson(strJson); } // json格式的字符串的生成 -- public static String getJson() throws Exception{ String strName = "张飞"; int niAge = 20; JSONObject json = new JSONObject(); json.put("name", strName); json.put("age", niAge); JSONObject js = new JSONObject(); js.put("city", "哈尔滨"); js.put("street", "和兴路"); json.put("address", js); // json格式的字符串 System.out.println(json.toString()); return json.toString(); } public static void parseJson(String strJson) throws Exception{ JSONObject json = new JSONObject(strJson); String strName = json.getString("name"); int niAge = json.getInt("age"); JSONObject js = json.getJSONObject("address"); String strCity = js.getString("city"); String strStreet = js.getString("street"); System.out.println("姓名:"+strName+",年龄:"+niAge+",城市:"+strCity+",街道:"+strStreet); }}
从上可看出JSONObject的用法有点像HashMap的用法,关于XML现在真是不太了解,详细请见以后的博客文章吧!欢迎来踩~