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();

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>


郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。