1.什么是XML
XML即Extensible Markup Language,可扩展标记语言,主要的应用有三方面:
- 存储数据,这个没什么好说的
- 传输数据,纯文本文件,不存在转换格式的麻烦
- 软件配置,比如今后学的配置tomcat虚拟目录映射等就用到了
2.XML文件结构
<?xml version="1.1" encoding="UTF-8" standalone="no"?>
<!DOCTYPE root SYSTEM "path.dtd">
<root>
.......
</root>
version是告诉浏览器使用什么版本的XML解析器,
encoding是来设置文件的编码,
standalone表明XML是否引入了其他非XML文件如css、dtd文件
<!DOCTYPE ...>
为内部或外部引入的DTD文件,DTD为Document Type Definition,用来定义合法的XML文件结构
<root></root>
为XML的根节点,只能有一个,里面存储自定义的标签元素
3.标签的书写规范
XML语法严格,对大小写敏感,不可间接嵌套;标签名不能以数字、_下划线、xml开头;标签名中不能出现空格、:
在XML中<,>,&,“,及逗号都是特殊字符,如要在标签内部使用需要使用内部实体代替
<?xml version="1.1" encoding="UTF-8"?>
<bean>
<user class="com.auncle.UserBean">
<id>1</id>
<name>小明</name>
<passWord>12345</passWord>
</user>
</bean>
一个简单的XML文件
4.解析XML
java 解析XML 的方式有4种:
- DOM
- SAX
- JDOM
- DOM4J
这4个对比:
- DOM采用的是整体读入,优点在需要向前处理时非常容易,DOM载入整个XML到树中,缺点是对于大文件的载入非常浪费资源
- SAX采用的事件处理,SAX不主动载入XML文档,只提供所有的文档操作事件,需要编程者手动处理所有的事件,优点在处理速度快,资源消耗最小,缺点是不能提供向前访问,只有重新载入文档才行
- JDOM采用的是DOM和SAX的综合体,80/20结构,并且提供了大量的适配器,不再需要自己构造DOM或者SAX的处理器,同时对于编程来说,不再使用工厂来提供对象,使JDOM编程更清晰易读
- DOM4J是一个非常优秀的Java XML API,具有性能优异、功能强大和易于使用的特点,同时它也是一个开放源代码的软件,DOM4J使用大量的接口,这也是它被认为比JDOM灵活的原因。
dom4j:
package com.auncle.test;
import org.apache.commons.io.FileUtils;
import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import java.io.*;
import java.net.InetAddress;
import java.net.URL;
import java.net.UnknownHostException;
import java.util.*;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
/**
* Created by 杨海涛
*
* @project:test
* @date:2019/3/2
*/
public class AuncleB {
public static void main(String[] args) throws Exception {
// 获得事件解析器
SAXReader saxReader = new SAXReader();
// 获得Document 对象
Document document = saxReader.read(new File("C:\\Users\\user\\Desktop\\测试.xml"));
// 读出根节点
Element rootElement = document.getRootElement();
// 遍历根节点
Iterator<Element> it = rootElement.elementIterator();
while (it.hasNext()) {
Element el2 = it.next();
// 获取根节点的属性值
List<Attribute> list = el2.attributes();
for (Attribute a : list) {
// 通过遍历获取id对应的属性值
Iterator<Element> it2 = el2.elementIterator();
while (it2.hasNext()) {
Element next = it2.next();
String name2 = next.getName();
String text2 = next.getText();
System.out.println(name2 + "=" + text2);
}
}
}
}
}