XML与JSON复习
1、什么是XML
XML(Extensible Markup Language 可扩展标记语言),XML是一个以文本来描述数据的文档。
2、SAX解析XML
SAX是Simple API for XML的缩写。
特点:
1、基于事件驱动
2、顺序读取。速度块
3、不能任意d读取节点(灵活性差)
4、解析时占用的内存小
数据处理器
package com.xml.test;
import java.util.ArrayList;
import java.util.List;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
/** 数据库处理器 继承DefaultHandler */
public class PersonHandler extends DefaultHandler {
List<Person> persons = null;
Person p = null;
String tag = null; // 记录当前是哪个标签值
// 开始解析文档时调用
@Override
public void startDocument() throws SAXException {
super.startDocument();
persons = new ArrayList<>();
}
// 结束解析文档时调用
@Override
public void endDocument() throws SAXException {
super.endDocument();
}
public List<Person> getPersons() {
return persons;
}
/**
* 读取到开始标签时调用 url:命名空间 localName:不带前缀的标签名 qName:带前缀的标签名 attributes:当前标签的属性集合
*/
@Override
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
super.startElement(uri, localName, qName, attributes);
if ("person".equals(qName)) {
p = new Person();
p.setId(Integer.valueOf(attributes.getValue("id")));
}
tag = qName;
}
// 读取结束标签时调用
@Override
public void endElement(String uri, String localName, String qName) throws SAXException {
super.endElement(uri, localName, qName);
if ("person".equals(qName)) {
persons.add(p);
}
tag = null;
}
// 解析到内容时调用
@Override
public void characters(char[] ch, int start, int length) throws SAXException {
super.characters(ch, start, length);
if (tag != null) {
switch (tag) {
case "name":
p.setName(new String(ch, start, length));
break;
case "mobile":
p.setMobile(new String(ch, start, length));
break;
case "email":
p.setEmail(new String(ch, start, length));
break;
}
}
}
}
3、DOM解析
Document Object Model(文档对象模型)
定义了一组Java接口,基于对象与语言和平台无关将XML文档表示为树。在内存中解析和存储XML文档,允许随机访问文档的不同部分。
特点:
@Test
public void DomXmlDemo() throws Exception {
Person p = null;
// 1、创建一个DOM解析器工厂对象
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
// 2、通过工厂对象创建解析器对象
DocumentBuilder documentBuilder = factory.newDocumentBuilder();
// 3、解析文档
InputStream is = new FileInputStream(new File("src/person.xml"));
// 4、XML文档加载到内存中,以树状形式存储
Document document = documentBuilder.parse(is);
// 5 获取指定节点对象集合
NodeList nodeList = document.getElementsByTagName("person");
List<Person> persons = new ArrayList<>();
for (int i = 0; i < nodeList.getLength(); i++) {
// 返回当前node对象
Node node = nodeList.item(i);
p = new Person();
// 获取标签上属性值
String id = node.getAttributes().getNamedItem("id").getNodeValue();
p.setId(Integer.valueOf(id));
// 获取当前node下所有子节点
NodeList childNodes = node.getChildNodes();
for (int j = 0; j < childNodes.getLength(); j++) {
Node item = childNodes.item(j);
String name = item.getNodeName();
switch (name) {
case "name":
p.setName(item.getFirstChild().getNodeValue());
break;
case "mobile":
p.setMobile(item.getFirstChild().getNodeValue());
break;
case "email":
p.setEmail(item.getFirstChild().getNodeValue());
break;
}
}
persons.add(p);
}
for (Person person : persons) {
System.out.println(person);
}
}
4、JDOM使用
特点:与DOM类似基于树型结构;第三方开源组件,实现使用JAVA的Collection接口,效率比DOM更快。
@Test
public void jDomXmlDemo() throws Exception{
//1 创建JDOM解析器
SAXBuilder builder = new SAXBuilder();
InputStream is = new FileInputStream(new File("src/person.xml"));
//2 解析
org.jdom2.Document document = builder.build(is);
//3 拿到根节点
Element element = document.getRootElement();
//4 拿到根节点的子节点
List<Person> persons = new ArrayList<>();
Person p = null;
List<Element> list = element.getChildren();
for (Element et : list) {
p = new Person();
String id = et.getAttributeValue("id");
p.setId(Integer.valueOf(id));
//获取下面的所有子节点
List<Element> children = et.getChildren();
for (Element e : children) {
//取到标签名
String name = e.getName();
switch (name) {
case "name":
p.setName(e.getText());
break;
case "mobile":
p.setMobile(e.getText());
break;
case "email":
p.setEmail(e.getText());
break;
}
}
persons.add(p);
}
for(Person person : persons){
System.out.println(person);
}
}
5、DOM4J使用
基于树型结构,第三方组件
解析速度快,效率高。使用JAVA中的迭代器实现数据读取。
@Test
public void dom4jXmlDemo() throws Exception{
// 1 创建Dom4j解析器
SAXReader reader = new SAXReader();
InputStream is = new FileInputStream(new File("src/person.xml"));
org.dom4j.Document document = reader.read(is);
//获取根节点
org.dom4j.Element element = document.getRootElement();
Iterator<org.dom4j.Element> iterator = element.elementIterator();
List<Person> persons = new ArrayList<>();
Person p = null;
while(iterator.hasNext()){
p = new Person();
org.dom4j.Element next = iterator.next();
String id = next.attributeValue("id");
p.setId(Integer.valueOf(id));
Iterator<org.dom4j.Element> iterator2 = next.elementIterator();
while(iterator2.hasNext()){
org.dom4j.Element next2 = iterator2.next();
String name = next2.getName();
switch (name) {
case "name":
p.setName(next2.getText());
break;
case "mobile":
p.setMobile(next2.getText());
break;
case "email":
p.setEmail(next2.getText());
break;
}
persons.add(p);
}
}
for(Person person : persons){
System.out.println(person);
}
}
6、对象生成XML文件
Java提供java.beans.XMLEncoder和java.beans.XMLDecoder类
7、JSON
/*** 单个对象*/
/** 数组对象*/