1.XML
XML 指可扩展标记语言(eXtensible Markup Language)。XML 被设计用来传输和存储数据。
(1)XML 文档形成了一种树结构,它从"根部"开始,然后扩展到"枝叶"。
示例:
<bookstore>
<book category="CHILDREN">
<title lang="en">Harry Potter</title>
<author>J K. Rowling</author>
<year>2005</year>
<price>29.99</price>
</book>
</bookstore>
在程序中常要对XML增加、修改、删除和检索,这就需要对XML进行解析
2.1 DOM解析
DOM (文档对象模型) 解析器读入整个文档,然后构建一个驻留内存的树结构,然后通过节点以及节点之间的关系来解析xml文件,操作这个树的结构。
- 优点:整个文档树在内存中,便于操作,支持删除、修改、重新排列等多种功能;
- 缺点:将整个文档调入内存(包括无用的节点),浪费时间和空间
- 使用场合:一旦解析了文档还需多次访问这些数据,但硬件资源充足(内存、CPU).
下面结合这个xml文件来进行dom解析。
step1:先在d盘准备一个students.xml文档
<?xml version="1.0" encoding="UTF-8"?>
<students>
<student sn="01">
<name>张三</name>
<age>18</age>
</student>
<student sn="02">
<name>李四</name>
<age>54</age>
</student>
</students>
step2:
package com.dom;
import java.io.File;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
import org.w3c.dom.Text;
public class Demo05 {
public static void main(String[] args)throws Exception {
DocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance();
DocumentBuilder db=dbf.newDocumentBuilder();
Document doc=db.parse(new File("d:\\students.xml"));
//增加一个学生节点
Element student=doc.createElement("student");
student.setAttribute("sn", "03");
Element name=doc.createElement("name");
Element age=doc.createElement("age");
Text nametxt=doc.createTextNode("小明");
Text agetxt=doc.createTextNode("25");
name.appendChild(nametxt);
age.appendChild(agetxt);
student.appendChild(name);
student.appendChild(age);
doc.getDocumentElement().appendChild(student);
//查找名为name的节点,并输出它的节点值
NodeList names=doc.getElementsByTagName("name");
if(null!=names&&names.getLength()>0)
{
for(int i=0;i<names.getLength();i++)
{
Element element=(Element)names.item(i);
System.out.println(element.getFirstChild().getNodeValue());
}
}
}
}
输出结果:
张三
李四
小明
2.2 SAX解析
SAX是一种基于事件驱动的API。利用SAX解析XML文档,涉及到两个部分,解析器和事件处理器,解析器负责读取XML文档,并向事件处理器发送事件,如元素的开始和元素的结束事件,而事件处理器则负责对事件做出响应,对传递XML数据进行处理。
- 优点:不用事先调入整个文档,占用资源少,SAX解析器代码比DOM解析器代码小。
- 缺点:
- 不是持久的,事件过后,若没保存数据,那么数据就丢了;
- 无状态性,只解析当前元素,无法访问之前的内容
- 从事件中只能得到文本,但不知道该文本属于哪个元素;
- 使用场合:只需XML文档的少量内容,很少回头访问;机器内存少;
package com.xzy;
import java.io.File;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.SAXParseException;
import org.xml.sax.helpers.DefaultHandler;
public class Demo01 {
public static void main(String[] args) throws Exception
{
SAXParserFactory spf=SAXParserFactory.newInstance();
SAXParser parser=spf.newSAXParser();
File f=new File("d:\\students.xml");//要读取的xml文档
parser.parse(f, new MyHandler());
}
//自定义事件处理器
public static class MyHandler extends DefaultHandler
{
@Override
public void startDocument() throws SAXException {
System.out.println("开始解析文档.......................................");
}
@Override
public void endDocument() throws SAXException {
System.out.println("结束解析文档.......................................");
}
@Override
public void endElement(String uri, String localName, String qName) throws SAXException {
System.out.println("结束元素:"+qName);
}
@Override
public void characters(char[] ch, int start, int length) throws SAXException {
System.out.println("文本:"+new String(ch,start,length));
}
@Override
public void error(SAXParseException e) throws SAXException {
System.out.println("出错了。。。。。。");
}
@Override
public void startElement(String uri, String localName, String qName, Attributes attributes)
throws SAXException {
System.out.println("开始元素:"+qName);
}
}
}
输出结果:
开始解析文档.......................................
开始元素:students
文本:
开始元素:student
文本:
开始元素:name
文本:张三
结束元素:name
文本:
开始元素:age
文本:18
结束元素:age
文本:
结束元素:student
文本:
开始元素:student
文本:
开始元素:name
文本:李四
结束元素:name
文本:
开始元素:age
文本:54
结束元素:age
文本:
结束元素:student
文本:
结束元素:students
结束解析文档.......................................