java高級_04

一 XML文件
   XML ---可擴展標記語言
   XML文件
   1 存儲數據:簡單靈活
   2 數據傳輸:平臺無關
   3 配置文件:可讀性強
    
   標籤:<product>開始標籤 </product>結束標籤 標籤都是成對出現
   屬性:包含在開始標籤中的屬性名=「屬性值」
   文本:包含在開始標籤和結束標籤之間的文本內容
二 解析XML文件
   1 DOM
     DOM:Document Object Model,即文檔對象模型
     DOM把XML文映射成一個倒掛的樹
     使用DOM解析XML文檔的步驟:
     1.1 建立解析器工廠對象
         DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
     1.2 由解析器工廠對象建立解析器對象
         DocumentBuilder db = dbf.newDocumentBuilder();
     1.3 由解析器對象對指定XML文件進行解析,構建相應DOM樹,建立Document對象
         Document document = db.parse("E:\\products.xml");
     1.4 以Document對象爲起點對DOM樹的節點進行增刪改查操做。
         節點Node:在樹中標籤,屬性,文本都是節點
         元素Element:元素就是標籤節點
         屬性Attr:屬性就是屬性節點
         文本Text:文本節點

                //1 獲取樹中的根元素(products)
        Element root = document.getDocumentElement();
        //2 根元素的子元素
        NodeList ps = root.getElementsByTagName("product");//獲取當前元素的叫作product的全部子元素
        //3 循環處理全部product子元素
        for(int i=0;i<ps.getLength();i++)
        {
            //獲取集合中的一個元素
            Element p = (Element)ps.item(i);
            //獲取當前節點的所欲子節點
            NodeList list = p.getChildNodes();
            //循環處理product中的全部子節點
            for(int j=0;j<list.getLength();j++)
            {
                //獲取一個子節點
                Node node = list.item(j);
                //獲取節點名和節點文本內容
                if(!node.getNodeName().startsWith("#"))
                    System.out.println("節點名:" + node.getNodeName() + ",節點文本內容:" + node.getTextContent());
            }
        }
         
   2 SAX
     
     事件驅動機制:當某一個事件發生時,會自動調用事件處理器中處理這種事件的方法

     SAX解析器不像DOM那樣創建一個完整的文檔樹,而是在讀取文檔時激活一系列事件,事件處理器提供對這些事件進行處理的方法

     1.1 建立解析器工廠對象
       SAXParserFactory sFactory = SAXParserFactory.newInstance();
     1.2 由解析器工廠對象建立解析器對象
       SAXParser sp =  sFactory.newSAXParser();
     1.3 由解析器對象對指定XML文件進行解析
           //3 解析(提供事件處理器)
       MyHandler myHandler = new MyHandler();
       sp.parse("E:\\products.xml",myHandler);
     1.4 重寫事件處理器中的方法對數據進行處理
         事件處理類繼承自DefaultHandler
         而後重寫事件處理中關注的事件對應的方法

        //若是是一個標籤的開始,就自動調用這個方法,qName是標籤名
    @Override
    public void startElement(String uri, String localName, String qName,
            Attributes attributes) throws SAXException {
    }
    
    //若是是文本內容,就自動調用這個方法,並且字符數組ch中存儲的就是這個文本內容
    @Override
    public void characters(char[] ch, int start, int length)
            throws SAXException {
    }
    
    //若是是一個標籤的結束,就自動調用這個方法,qName是標籤名
    @Override
    public void endElement(String uri, String localName, String qName)
            throws SAXException {
    }

   下邊兩種方式須要導入jar包
   3 JDOM
     1 解析器
     SAXBuilder sBuilder = new SAXBuilder();
     2 解析
    Document document = sBuilder.build("E:\\products.xml");
        
     3 從document中獲取須要的數據
    Element root = document.getRootElement();//獲取根元素
        getChild(String name)//獲取叫作name的那一個子元素
        getChildren()//獲取全部的子元素
        getChildren(String name)//獲取全部叫作name的子元素

    getChildText(String name)//直接獲取叫作name的那一個子元素的文本內容

   4 DOM4J
            1 解析器
        SAXReader sr = new SAXReader();
        2 解析
        Document document = sr.read("E:\\products.xml");
        
        3 從document中獲取須要的數據
        Element root = document.getRootElement();//products
        
        獲取root下的product子元素構成的集合的迭代器
        Iterator<Element> it = root.elementIterator("product");
    
            Element element = it.next();
            //獲取element下的全部子元素組成的集合的迭代器
            Iterator<Element> iterator = element.elementIterator();
java

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;


public class TestDOM {

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        try {
            (new DomXML()).parse();
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

}

class DomXML
{
    //用DOM方式解析XML文件
    public void parse() throws Exception
    {
        //1 解析器工廠
        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
        //2 解析器
        DocumentBuilder db = dbf.newDocumentBuilder();
        //3 解析
        Document document = db.parse("E:\\products.xml");
        //4 把倒掛的樹中的有效數據拿出來
        
        //1 獲取樹中的根元素(products)
        Element root = document.getDocumentElement();
        //2 根元素的子元素
        NodeList ps = root.getElementsByTagName("product");//獲取當前元素的叫作product的全部子元素
        //3 循環處理全部product子元素
        for(int i=0;i<ps.getLength();i++)
        {
            //獲取集合中的一個元素
            Element p = (Element)ps.item(i);
            //獲取當前節點的所欲子節點
            NodeList list = p.getChildNodes();
            //循環處理product中的全部子節點
            for(int j=0;j<list.getLength();j++)
            {
                //獲取一個子節點
                Node node = list.item(j);
                //獲取節點名和節點文本內容
                if(!node.getNodeName().startsWith("#"))
                    System.out.println("節點名:" + node.getNodeName() + ",節點文本內容:" + node.getTextContent());
            }
        }
    }
}

     

import java.util.Iterator;
import java.util.List;

import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;


public class TestDOM4J {

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        try {
            DOM4JXML.parse();
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

}

class DOM4JXML
{
    public static void parse() throws Exception
    {
        //1 解析器
        SAXReader sr = new SAXReader();
        //2 解析
        Document document = sr.read("E:\\products.xml");
        
        //3 從document中獲取須要的數據
        Element root = document.getRootElement();//products
        
        //獲取root下的子元素構成的集合的迭代器
        Iterator<Element> it = root.elementIterator("product");
        
        while(it.hasNext())
        {
            Element element = it.next();//product
            Iterator<Element> iterator = element.elementIterator();
            
            while(iterator.hasNext())
            {
                Element element2 = iterator.next();
                System.out.println(element2.getName() + "," + element2.getText());
            }
        }
    }
}
import java.util.Iterator;
import java.util.List;

import org.jdom.Document;
import org.jdom.Element;
import org.jdom.JDOMException;
import org.jdom.input.SAXBuilder;



public class TestJDOM {

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        try {
            JDOMXML.parse();
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

}

class JDOMXML
{
    public static void parse() throws Exception
    {
        //1 解析器
        SAXBuilder sBuilder = new SAXBuilder();
        //2 解析
        Document document = sBuilder.build("E:\\products.xml");
        
        //3 從document中獲取須要的數據
        Element root = document.getRootElement();//products
        
        //root下的子元素
        List list = root.getChildren("product");
        Iterator<Element> it = list.iterator();
        while(it.hasNext())
        {
            Element element = it.next();//product
            /*
            //product才的全部子元素
            List lt = element.getChildren();
            Iterator<Element> iterator = lt.iterator();
            while(iterator.hasNext())
            {
                Element element2 = iterator.next();
                System.out.println(element2.getName() + "," + element2.getText());
            }*/
            
            System.out.println("id = " + element.getChildText("productid"));
            System.out.println("name = " + element.getChildText("product_name"));
            System.out.println("price = " + element.getChildText("price"));
            System.out.println("num = " + element.getChildText("num"));
            System.out.println("time = " + element.getChildText("publish_time"));
        }
    }
}
import java.util.ArrayList;
import java.util.Iterator;

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 TestSAX {

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        try {
            SAXXML.parse();
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

}

class SAXXML
{
    public static void parse() throws Exception, SAXException
    {
        //1 解析器工廠
        SAXParserFactory sFactory = SAXParserFactory.newInstance();
        //2 解析器
        SAXParser sp =  sFactory.newSAXParser();
        //3 解析(提供事件處理器)
        MyHandler myHandler = new MyHandler(); 
        sp.parse("E:\\products.xml",myHandler);
        //獲取解析出的全部產品並打印
        ArrayList<Product> list = myHandler.getList();
        Iterator<Product> iterator = list.iterator();
        while(iterator.hasNext())
        {
            System.out.println(iterator.next());
        }
    }
}

//事件處理器類
class MyHandler extends DefaultHandler
{
    private ArrayList<Product> list = new ArrayList<Product>();//存儲解析出來的全部產品數據
    private Product product;//存一個產品信息
    private String tag;//存儲標籤名
    
    public ArrayList<Product> getList() {
        return list;
    }
    
    //若是是一個標籤的開始,就自動調用這個方法,qName是標籤名
    @Override
    public void startElement(String uri, String localName, String qName,
            Attributes attributes) throws SAXException {
        // TODO Auto-generated method stub
        //System.out.println(qName + "開始");
        tag = qName;//保存標籤名
        if(tag.equals("product"))
            product = new Product();//存儲接下來要解析出的產品信息
    }
    
    //若是是文本內容,就自動調用這個方法,並且字符數組ch中存儲的就是這個文本內容
    @Override
    public void characters(char[] ch, int start, int length)
            throws SAXException {
        // TODO Auto-generated method stub
        //System.out.println("內容:" + new String(ch,start,length));
        String data = new String(ch,start,length).trim();
        if(!data.equals(""))
        {
            if(tag.equals("productid"))
                product.setId(Integer.parseInt(data));
            if(tag.equals("product_name"))
                product.setName(data);
            if(tag.equals("price"))
                product.setPrice(Integer.parseInt(data));
            if(tag.equals("num"))
                product.setNum(Integer.parseInt(data));
            if(tag.equals("publish_time"))
                product.setTime(data);
        }    
    }
    
    //若是是一個標籤的結束,就自動調用這個方法,qName是標籤名
    @Override
    public void endElement(String uri, String localName, String qName)
            throws SAXException {
        // TODO Auto-generated method stub
        //System.out.println(qName + "結束");
        tag = qName;
        if(tag.equals("product"))
            list.add(product);    //把解析出來的這個產品信息添加到集合
    }
}

class Product
{
    private int id;
    private String name;
    private int price;
    private int num;
    private String time;
    
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getPrice() {
        return price;
    }
    public void setPrice(int price) {
        this.price = price;
    }
    public int getNum() {
        return num;
    }
    public void setNum(int num) {
        this.num = num;
    }
    public String getTime() {
        return time;
    }
    public void setTime(String time) {
        this.time = time;
    }
    
    @Override
    public String toString() {
        // TODO Auto-generated method stub
        return id + name + price + num + time;
    }

}
<?xml version="1.0" encoding="UTF-8"?>
<products>
   <product>
      <productid>1</productid>
      <product_name>電腦500</product_name>
      <price>5000</price>
      <num>1000</num>
      <publish_time>2012-01-01</publish_time>
   </product>
   <product>
      <productid>2</productid>
      <product_name>TCL智能家電</product_name>
      <price>5000</price>
      <num>1000</num>
      <publish_time>2012-01-01</publish_time>
   </product>
</products>
相關文章
相關標籤/搜索