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