01 Java-DOM4J(DOM4J 开源组织 )-DOM 解析 XML 文件
解析:是用 Java 等相关技术将 XML 文件中有用的信息提取
出来的过程叫解析。
解析分为二个大类别
1. DOM ( Document Object Model )类别
一次性将硬盘中的 XML 文件加载的内存形成一个倒状的树结构,从根开始从上向下依次遍历,获取有用节点的内容
2. SAX(Simple Api for Xml) 类别
分多次将硬盘中的 XML 文件加载的内存中,以事件的方式去解析节点中有用的内容
目前 :
1. 空间不是问题,问题是时间, 所以 W3C 组织推荐使用 DOM 技术解析。
// 创建 XML 文件,无文件则创建;有文件则覆盖
Document xmlDocument = DocumentHelper.createDocument();
// 将符合条件的字符串转成 XML 文件
Document xmlDocument = DocumentHelper.parseText(str);
// 创建 dom4j 核心解析器
SAXReader saxReader = new SAXReader();
// 读取硬盘中的 xml 文件
Document xmlDocument = saxReader.read(new File("E:/bookstore.xml"));
// 写出到硬盘文件
XMLWriter xmlWriter = new XMLWriter(new FileWriter("E:\\test.xml"));
xmlWriter.write(document);
xmlWriter.close();
将 Document 对象写入 XML 文件
1. 文档中全为英文 , 不设置编码 , 直接写入的形式 .
XMLWriter writer = new XMLWriter(new FileWriter("output.xml"));
writer.write(document); writer.close();
2. 文档中含有中文 , 设置编码格式写入的形式 .
OutputFormat format = OutputFormat.createPrettyPrint();// 指定 XML 编码
format.setEncoding("GBK");
XMLWriter writer = new XMLWriter(newFileWriter("output.xml"),format);
writer.write(document);writer.close();
字符串与 XML 的转换
1. 将字符串转化为 XML
String text = "<members> <member>sitinspring</member></members>";
Document document = DocumentHelper.parseText(text);
2. 将文档或节点的 XML 转化为字符串 .
类加载器 : 我们的所有程序文件,都是由类加载器去读取硬盘中的内容,以流的方式加载到 JVM 中的
类加载器分为不同的类别,如果是读取我们自已创建的程序文件,始终只是一个类加载器去负责读取
类加载器不会乱去加载,只会去类目录下加载文件,即在开发工具的默认是 src 目录下加载
02 XPATH 表达式 (//goods[@id='isbn100'])
XPATH 就是一个字符串,不过这个字符串有其特殊的含义, 利用其特殊含义能快速定位节点。
使用 XPath 必须导入 jaxen-1.1-beta-6.jar , 在 dom4j 的 lib 文件夹下
和 jaxen-1.1-beta-6.jar
/tv/a/b/c/d 表示从根节点开始查询,一直查询到 d 节点
XPATH 使用方法
查询节点
获取所有符合条件的节点
selectNodes(String xpathExpression) 返回 List 集合
获取符合条件的单个节点
selectSingleNode(String xpathExpression) 返回一个 Node 对象。
如果符合条件的节点有多个,那么返回第一个。
03 web 入门
做 WEB 应用,就是属于 B/S 软件结构
所有的客户端和所有的服务器要通信,必须采用双方认可的规则,即 HTTP (超文本传输协议)
Web 应用的特点
1_ 服务器响应客户端的是 HTML
2_ 客户端采用 URL 来定位全世界唯一的资源
3_ 为了便于记忆,不用 IP ,用域名来对 IP 进行封装
4_ 客户端与服务器都采用 HTTP 这种应用层的协议,底层是 TCP/IP 协议
web 网站上有二类资源,一类是动态资源,一类是静态资源,
静态资源用 html/css 技术完成,动态资源用 servlet/jsp/asp/php 技术完成,
凡是用 java 技术来开发 web 应用中的动态资源,统称为 JavaWeb
客户端访问服务器,不管服务器是否有对应的资源,服务器都会给客户端以响应,
所以响应可分为正确响应和错误响应
客户端使用 URL 来访问服务器的资源:以下例如:
http://www.baidu.com:8080/mail/index.html 回车
http:// 协议名称,这只是 web 中最常用的协议,例如: https:// , ftp:// ,等等
www.baidu.com 全世界唯一的一个域名,通常一个域名对应着一个唯一的 IP 地址
8080 表示服务器上的一个资源所占用的端口号,通常是不变的, HTTP 协议默认端口号为 80
/mail 表示服务器上的一个资源的路径
/index.html 表示服务器上的一个具体资源名称
学习 Web 应用之前,为什么要用 Web 服务器呢?
因为如果 Web 服务器,不能将本地资源读取出来,并响应给远程的客户端,
这时 Web 服务器相当于一个中介,接收客户端的请求,并做出对应的响应
我们可以将 Web 服务器理解为本例的 Demo01 这么一个网络应用程序
什么 JavaEE 规范?
JavaEE 规范表示多个具体技术的统称,例如: Servlet , Jsp , JavaBean , JDBC , JavaMail ,。。。。
04 常见服务器简介
oracle--WebLogic--- 适合于大型应用
ibm-----WebSphere--- 适合于大型应用
apache---tomcat--- 适合于小型应用 --- 开 java 源免费
启动 tomcat 服务器后,在浏览器地址栏输入如下 URL : http://127.0.0.1:8080 回车
127.0.0.1 是本机 IP 地址
localhost 是本机域名 ,在 tomcat 中默认的虚拟主机名字就叫做 localhost
192.168.32.9 局域网中本机 IP 地址
提倡用 127.0.0.1 这个
05 Tomcat 的安装,启动与目录结构
通过浏览器访问的应用,我们叫 web 应用,
这里说的浏览器可以是 PC 浏览器,也可以是移动设备上的浏览器
所有的 web 资源,都应该放在一个目录下保存,该目录我们叫 web 应用的根目录,也叫网站的根目录
创建好的 web 应用,必须将其根目录放到 web 服务器管理,方可被外界访问,这个过程叫 虚拟目录的映射
06 在 Tomcat 中设置虚拟目录和主机 / 网站 / 站点
<Context
docBase=" 真实 web 应用根目录所有的位置 "
path=" 以 / 开头的虚拟目录名字 " />
配置虚拟目录
修改 tomcat/conf/server.xml 文件
<Host>
<Context docBase="E:\mail" path="" />
<Context docBase="E:\mail" path="/mail" />
<Context docBase="E:\mail" path="/xx/mail" />
<Context docBase="E:\mail" path="/xx/yy/mail" />
</Host>
配置虚拟主机 / 网站,即 tomcat 服务器中有一个虚拟的 www.baidu.com 网站,目前只能供自己访问,不能供外界访问
修改 tomcat/conf/server.xml 文件
<Host name="www.baidu.com" appBase="E:\">
<Context docBase="E:\mail" path="" />
<Context docBase="E:\mail" path="/mail" />
<Context docBase="E:\mail" path="/xx/mail" />
<Context docBase="E:\mail" path="/xx/yy/mail" />
</Host>
修改 C:\Windows\System32\drivers\etc\Hosts 文件
#127.0.0.1 www.baidu.com
最终效果:
http://www.baidu.com:8080/mail/index.html 回车
http://www.baidu.com:8080/index.html 回车
http://www.baidu.com/index.html 回车( HTTP 协议默认是 80 ,修改 tomcat 的端口号为 80 )
http://www.baidu.com/index.html 回车( path="" )
http://www.baidu.com 回车(默认欢迎文件)
www.baidu.com 虚拟主机 / 网站
/mail 虚拟目录
输入域名,计算机的解析过程
浏览器先去本地找 Hosts 文件,将域名解析成 ip 地址
如果本地找不到,再去 internet 的 dns 服务器找域名对应的 ip 地址
如果本地找到了,不去 internet 找了
07 web 应用结构以及在 MyEclipse 中创建 web 应用
Dom4j 的重点代码赏析:
1.dom4j 基本使用
/**
* 演示使用 dom4j 如下内容
* 1 )创建一个新的 xml 文件
* 2 )将一个符合 xml 文件内容的字符串转成 xml 文件
* 3 )加载已存在的 xml 文件到内存,形成一个倒状的树结构,根就是 Document 对象
*/
/**
* 创建一个新的 xml 文件
*/
public static void type01() throws Exception {
// 创建一个内存对象 Document ,它就表示硬盘中 xml 文件
Document xmlDocument = DocumentHelper.createDocument();
// 将内存中的对象 Document 写入到硬盘中,形成一个 xml 文件
XMLWriter xmlWriter = new XMLWriter(new FileOutputStream(new File("E:/new.xml")));
xmlWriter.write(xmlDocument);
xmlWriter.close();
}
/**
* 将一个符合 xml 文件内容的字符串转成 xml 文件
*/
public static void type02() throws Exception {
// 创建符合 xml 内容的字符串
String str = "<root><city> 广州 </city></root>";
// 将字符串转成 document 对象
Document xmlDocument = DocumentHelper.parseText(str);
// 将内存中的 document 对象输出到硬盘,形成一个 xml 文件
XMLWriter xmlWriter = new XMLWriter(new FileOutputStream(new File("E:/new.xml")));
xmlWriter.write(xmlDocument);
xmlWriter.close();
}
/**
* 加载已存在的 xml 文件到内存,形成一个倒状的树结构,根就是 Document 对象
*/
public static void type03() throws Exception {
// 创建 dom4j 核心解析器
SAXReader saxReader = new SAXReader();
// 读取硬盘中的 xml 文件
Document xmlDocument = saxReader.read(new File("E:/bookstore.xml"));
// 判断是否已读取到 xml 文件
System.out.println(xmlDocument!=null?" 已读取 xml 文件 ":" 未读取 xml 文件 ");
}
/**
* 使用 dom4j 解析器
* 1 )获取根节点的名字
* 2 )获取根节点下的直接子节点的个数
*/
public class Demo02 {
public static void main(String[] args) throws Exception{
// 创建 dom4j 解析器对象
SAXReader saxReader = new SAXReader();
// 创建 InputStream 对象,指向硬盘的 xml 文件
InputStream is = new FileInputStream(new File("E:\\bookstore.xml"));
// 通过字节流,加载硬盘中的 xml 文件到内存
Document xmlDocument = saxReader.read(is);
// 获取根节点
Element rootElement = xmlDocument.getRootElement();
// 显示根节点的名字
System.out.println(rootElement.getName());
// 获取根节点下的直接子节点的个数和名字
List<Element> list = rootElement.elements("book");
System.out.println(" 根节点下有 "+list.size()+" 直接子节点 ");
}
}
/**
* 使用 dom4j 解析器
* 1 )解析所有 book 节点属性值
* 2 )解析所有 book 节点下子节点中的内容
*/
public class Demo03 {
public static void main(String[] args) throws Exception{
// 创建 dom4j 解析器对象
SAXReader saxReader = new SAXReader();
// 创建 InputStream 对象,指向硬盘的 xml 文件
InputStream is = new FileInputStream(new File("E:\\bookstore.xml"));
// 通过字节流,加载硬盘中的 xml 文件到内存
Document xmlDocument = saxReader.read(is);
// 获取根节点
Element rootElement = xmlDocument.getRootElement();
// 获取根节点下所有 book 子节点所形成的集合
List<Element> list = rootElement.elements("book");
// 迭代
for(Element element : list){
// 获取 book 节点的 id 属性值
String id = element.attributeValue("id");
// 分别获取 book 节点的 title/auth/price 子节点的内容
String title = element.element("title").getText().trim();
String auth = element.element("auth").getText().trim();
String price = element.element("price").getText().trim();
// 将来我们可以将上述属性值封装到 JavaBean 对象中的所有属性中,加入到 List<JavaBean> 集合
System.out.println(id+":"+title+":"+auth+":"+price);
System.out.println("------------------------------");
}
}
}
/**
* 使用 dom4j 解析器
* 1 )修改节点的属性值
* 2 )修改节点中的内容
* 3 )将内存中的 document 对象,写入到硬盘中的 xml 文件
*/
public class Demo04 {
public static void main(String[] args) throws Exception{
// 创建 dom4j 解析器对象
SAXReader saxReader = new SAXReader();
// 创建 InputStream 对象,指向硬盘的 xml 文件
InputStream is =
Demo04.class.getClassLoader().getResourceAsStream("cn/itcast/android/xml/bookstore.xml");
// 通过字节流,加载硬盘中的 xml 文件到内存
Document xmlDocument = saxReader.read(is);
// 获取根节点
Element rootElement = xmlDocument.getRootElement();
// 获取根节点下所有 book 子节点所形成的集合
List<Element> list = rootElement.elements("book");
// 迭代
for(Element element : list){
// 如果 book 节点的 id 属性值是 "it201501" 的话
if(element.attributeValue("id").equals("it201501")){
// 修改 book 节点的 id 属性值
element.addAttribute("id","it201601");
}
// 如果 book 节点的 price 子节点的内容为 222 的话
if(element.element("price").getText().equals("222")){
// 修改 book 节点的 price 子节点内容
element.element("price").setText("333");
}
}
// 上述修改只在内存中,还得将内存中的 document 对象写入到硬盘的 xml 文件中
// 紧缩格式: createCompactFormat()
// 优美格式: createPrettyPrint()
OutputFormat format = OutputFormat.createPrettyPrint();
OutputStream os = new FileOutputStream(new File("E:/bookstore.xml"));
XMLWriter xmlWriter = new XMLWriter(os,format);
xmlWriter.write(xmlDocument);
xmlWriter.close();
}
}
/**
* 使用 dom4j 解析器
* 1 )创建新节点,即 Element
* 2 )为节点添加属性和子节点
* 3 )将新节点添加到所有原来节点之后和之前
*/
public class Demo05 {
public static void main(String[] args) throws Exception{
// 创建 dom4j 解析器对象
SAXReader saxReader = new SAXReader();
// 创建 InputStream 对象,指向硬盘的 xml 文件
Document xmlDocument = saxReader.read(Demo05.class.getClassLoader().getResource("cn/itcast/android/xml/bookstore.xml"));
// 获取根节点
Element rootElement = xmlDocument.getRootElement();
// 获取根节点下的所有子节点
List<Element> list = rootElement.elements("book");
// 创建新 book 节点
Element newBookElement = DocumentHelper.createElement("book");
// 为新 book 节点设置属性值
newBookElement.addAttribute("id","it201503");
// 为新 book 节点添加子节点及其内容
newBookElement.addElement("title").setText("ios 编程指南 ");
// 将新 book 节点添加到所有 book 节点之后
//list.add(newBookElement);
// 将新 book 节点插入到第一个位置
list.add(1,newBookElement);
// 将 document 对象输出到硬盘中,形成 xml 文件
OutputFormat format = OutputFormat.createPrettyPrint();
OutputStream os = new FileOutputStream(new File("E:/bookstore.xml"));
XMLWriter xmlWriter = new XMLWriter(os,format);
xmlWriter.write(xmlDocument);
xmlWriter.close();
}
}
XPATH 用法
/**
* 使用 dom4j 解析器
* 传统方式定位 d 标签
* XPATH 方式定位 d 标签
*/
public class Demo06 {
public static void main(String[] args) throws Exception{
// 创建 dom4j 解析器对象
SAXReader saxReader = new SAXReader();
// 创建 InputStream 对象,指向硬盘的 xml 文件
Document xmlDocument =
saxReader.read(
Demo06.class.getClassLoader().getResource("cn/itcast/android/xml/tv.xml"));
//Element rootElement = xmlDocument.getRootElement();
//String name = rootElement.element("a").element("b").element("c").element("d").getText().trim();
//System.out.println(name);
//System.out.println("----------------------------------");
//String xpath = "/tv/a/b/c/d";
//String xpath = "//d";
//String age = "23";
//String xpath = "//d[@age='"+age+"']";
String xpath = "//e[@name=' 哈哈 ' and @pass='123']";
Element element = (Element) xmlDocument.selectSingleNode(xpath);
//List<Element> list = xmlDocument.selectNodes(xpath);
if(element!=null){
String name = element.getText().trim();
System.out.println(name);
}else{
System.out.println(" 查无此人 ");
}
}
}