XML简介

JavaXML解析大概有四种,包括DOMSAXJDOMDOM4J,其中DOMSAX解析是基础的两种:XML 独立于计算机平台,操作系统和编程语言来表示数据,凭借其简单性、可扩展性、交互性和灵活性在计算机行业中得到了世界范围的支持与采纳,其作用主要有一下3点:

1)数据存储:XOM和数据库一样,都可以实现数据的持久化存储。两者相比,数据库提供了耿强有力的数据存储和分析能力,XML仅仅是存储数据,XML与其他数据表现形式最大的不同时它极其简单。

2)数据交换:在实际应用中,由于各个计算机所使用的操作系统,数据库不同,因此数据之间的交换想来是头疼的事情,但可以使用XML交换数据来解决这个问题,例如:可以将数据库A中的数据转换成标准的XML文件,然后数据库B再将该标准的XML文件转换成适合自己数据要求的数据,以便达到交换数据的目的。

3)数据配置:许多应用都将配置数据存储在XML文件中,使用XML配置文件可读性强,灵活性高,不用像其他应用那样要经过重新编译才能修改和维护应用。

下面我们来看看用DOM来解析XMLDOM即可看成是基于树的模型:

配置文件如下:

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 List
list = 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";        List
list = 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现在真是不太了解,详细请见以后的博客文章吧!欢迎来踩~