java XML

   XML簡介

JavaXML解析大概有四種,包括DOMSAXJDOMDOM4J,其中DOMSAX解析是基礎的兩種:XML 獨立於計算機平臺,操作系統和編程語言來表示數據,憑藉其簡單性、可擴展性、交互性和靈活性在計算機行業中得到了世界範圍的支持與採納,其作用主要有一下3點:

1)數據存儲:XOM和數據庫一樣,都可以實現數據的持久化存儲。兩者相比,數據庫提供了耿強有力的數據存儲和分析能力,XML僅僅是存儲數據,XML與其他數據表現形式最大的不同時它極其簡單。

2)數據交換:在實際應用中,由於各個計算機所使用的操作系統,數據庫不同,因此數據之間的交換想來是頭疼的事情,但可以使用XML交換數據來解決這個問題,例如:可以將數據庫A中的數據轉換成標準的XML文件,然後數據庫B再將該標準的XML文件轉換成適合自己數據要求的數據,以便達到交換數據的目的。

3)數據配置:許多應用都將配置數據存儲在XML文件中,使用XML配置文件可讀性強,靈活性高,不用像其他應用那樣要經過重新編譯才能修改和維護應用。

下面我們來看看用DOM來解析XMLDOM即可看成是基於樹的模型:

配置文件如下:

<?xml version = "1.0" encoding = "UTF-8"?>
<pet>
    <dog id ="1">
        <name>qizai</name>
        <age>5</age>
        <love>100</love>
    </dog>
    <dog id ="2">
        <name>maomao</name>
        <age>3</age>
        <love>101</love>
    </dog>
</pet>

下面用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:maomao
age: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<Pet> list = null;
    private Pet pet = null;
    private String preTagName = null;
    /*
     * 獲得pet集合的方法
     */
    public List<Pet> 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<Pet>();
                                                                                      
    }
    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<Pet>list = sax.getPet(fileURL);
        for(Pet pet : list){
            System.out.println(pet);
        }
    }
}
輸出:
開始解析文檔!
pet
dog
name
age
love
dog
name
age
love
解析文檔結束!

   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現在真是不太瞭解,詳細請見以後的博客文章吧!歡迎來踩~

   

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章