轻装上阵,安卓工程师之路---day05(Dom4J & Tomcat)

01 Java-DOM4J(DOM4J开源组织)-DOM解析XML文件

解析:是用Java等相关技术将XML文件中有用的信息提取

出来的过程叫解析。

解析分为二个大类别

1. DOMDocument 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 , dom4jlib文件夹下

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规范表示多个具体技术的统称,例如:ServletJspJavaBeanJDBCJavaMail,。。。。

04 常见服务器简介

oracle--WebLogic---适合于大型应用

ibm-----WebSphere---适合于大型应用

apache---tomcat---适合于小型应用---java源免费

启动tomcat服务器后,在浏览器地址栏输入如下URLhttp://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:WindowsSystem32driversetcHosts文件

   #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地址

如果本地找不到,再去internetdns服务器找域名对应的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("查无此人");

}

}

}

原文地址:https://www.cnblogs.com/canceler/p/4675185.html