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("查无此人");
}
}
}