一 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>