一、环境准备java
(1)下载dom4j-1.6.1.jarnode
(2)下载junit-4.10.jar微信
二、舒适提示dom
解析XML过程是经过获取Document对象,而后继续获取各个节点以及属性等操做,所以获取Document对象是第一步,大致说来,有三种方式:编码
(1)本身建立Document对象spa
[java] view plaincopyprint?在CODE上查看代码片派生到个人代码片.net
Document document = DocumentHelper.createDocument(); code
Element root = document.addElement("students"); orm
其中students是根节点,能够继续添加其余节点等操做。
(2)读取XML文件获取Document对象
[java] view plaincopyprint?在CODE上查看代码片派生到个人代码片
//建立SAXReader对象
SAXReader reader = new SAXReader();
//读取文件 转换成Document
Document document = reader.read(new File("XXXX.xml"));
(3)读取XML文本内容获取Document对象
[java] view plaincopyprint?在CODE上查看代码片派生到个人代码片
String xmlStr = "
Document document = DocumentHelper.parseText(xmlStr);
三、示例
(1)xml文件内容以下
[html] view plaincopyprint?在CODE上查看代码片派生到个人代码片
<微信公众号>@残缺的孤独微信公众号>
<学号>20140101学号>
<地址>北京海淀区地址>
<座右铭>要么强大,要么听话座右铭>
<新浪微博>@残缺的孤独新浪微博>
<学号>20140102学号>
<地址>北京朝阳区地址>
<座右铭>在哭泣中学会坚强座右铭>
(2)解析过程
[java] view plaincopyprint?在CODE上查看代码片派生到个人代码片
package cn.com.yy.dom4j;
import java.io.File;
import java.util.Iterator;
import java.util.List;
import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import org.junit.Test;
public class Dom4JforXML {
@Test
public void test() throws Exception{
//建立SAXReader对象
SAXReader reader = new SAXReader();
//读取文件 转换成Document
Document document = reader.read(new File("src/cn/com/yy/dom4j/s.xml"));
//获取根节点元素对象
Element root = document.getRootElement();
//遍历
listNodes(root);
}
//遍历当前节点下的全部节点
public void listNodes(Element node){
System.out.println("当前节点的名称:" + node.getName());
//首先获取当前节点的全部属性节点
List
//遍历属性节点
for(Attribute attribute : list){
System.out.println("属性"+attribute.getName() +":" + attribute.getValue());
}
//若是当前节点内容不为空,则输出
if(!(node.getTextTrim().equals(""))){
System.out.println( node.getName() + ":" + node.getText());
}
//同时迭代当前节点下面的全部子节点
//使用递归
Iterator
while(iterator.hasNext()){
Element e = iterator.next();
listNodes(e);
}
}
}
(3)解析结果
[html] view plaincopyprint?在CODE上查看代码片派生到个人代码片
当前节点的名称:students
当前节点的名称:student1
属性id:001
当前节点的名称:微信公众号
微信公众号:@残缺的孤独
当前节点的名称:学号
学号:20140101
当前节点的名称:地址
地址:北京海淀区
当前节点的名称:座右铭
座右铭:要么强大,要么听话
当前节点的名称:student2
属性id:002
当前节点的名称:新浪微博
新浪微博:@残缺的孤独
当前节点的名称:学号
学号:20140102
当前节点的名称:地址
地址:北京朝阳区
当前节点的名称:座右铭
座右铭:在哭泣中学会坚强
四、dom4j操做节点属性
使用dom4j能够操做节点属性,好比添加节点属性、删除节点属性、修改属性值等操做。下面使用dom4j为上述的student1节点删除id属性,新添name属性。
(1)代码示例
[java] view plaincopyprint?在CODE上查看代码片派生到个人代码片
@Test
public void test2()throws Exception{
//建立SAXReader对象
SAXReader reader = new SAXReader();
//读取文件 转换成Document
Document document = reader.read(new File("src/cn/com/yy/dom4j/s.xml"));
//获取根节点元素对象
Element root = document.getRootElement();
System.out.println("-------添加属性前------");
//获取节点student1
Element student1Element = root.element("student1");
//遍历
listNodes(student1Element);
//获取其属性
Attribute idAttribute = student1Element.attribute("id");
//删除其属性
student1Element.remove(idAttribute);
//为其添加新属性
student1Element.addAttribute("name", "这是student1节点的新属性");
System.out.println("-------添加属性后------");
listNodes(student1Element);
}
(2)结果
[html] view plaincopyprint?在CODE上查看代码片派生到个人代码片
-------添加属性前------
当前节点的名称:student1
属性id:001
当前节点的名称:微信公众号
微信公众号:@残缺的孤独
当前节点的名称:学号
学号:20140101
当前节点的名称:地址
地址:北京海淀区
当前节点的名称:座右铭
座右铭:要么强大,要么听话
-------添加属性后------
当前节点的名称:student1
属性name:这是student1节点的新属性
当前节点的名称:微信公众号
微信公众号:@残缺的孤独
当前节点的名称:学号
学号:20140101
当前节点的名称:地址
地址:北京海淀区
当前节点的名称:座右铭
座右铭:要么强大,要么听话
五、dom4j新增节点
使用dom4j能够删除指定节点、新增节点等操做,咱们使用dom4j为student1节点新增phone节点,以下。
(1)代码
[java] view plaincopyprint?在CODE上查看代码片派生到个人代码片
//添加节点
@Test
public void test3()throws Exception{
//建立SAXReader对象
SAXReader reader = new SAXReader();
//读取文件 转换成Document
Document document = reader.read(new File("src/cn/com/yy/dom4j/s.xml"));
//获取根节点元素对象
Element root = document.getRootElement();
System.out.println("-------添加节点前------");
//获取节点student1
Element student1Element = root.element("student1");
//遍历
listNodes(student1Element);
//添加phone节点
Element phoneElement = student1Element.addElement("phone");
//为phone节点设置值
phoneElement.setText("137xxxxxxxx");
System.out.println("-------添加节点后------");
listNodes(student1Element);
}
(2)结果
[html] view plaincopyprint?在CODE上查看代码片派生到个人代码片
-------添加节点前------
当前节点的名称:student1
属性id:001
当前节点的名称:微信公众号
微信公众号:@残缺的孤独
当前节点的名称:学号
学号:20140101
当前节点的名称:地址
地址:北京海淀区
当前节点的名称:座右铭
座右铭:要么强大,要么听话
-------添加节点后------
当前节点的名称:student1
属性id:001
当前节点的名称:微信公众号
微信公众号:@残缺的孤独
当前节点的名称:学号
学号:20140101
当前节点的名称:地址
地址:北京海淀区
当前节点的名称:座右铭
座右铭:要么强大,要么听话
当前节点的名称:phone
phone:137xxxxxxxx
六、把Document对象写入新的文件
有时,咱们须要把document对象写入新的文件,dom4j提供了对应的API以便咱们进行操做。咱们在完成第 5 后,把document写入新的文件s1.xml,以下。
(1)代码
[java] view plaincopyprint?在CODE上查看代码片派生到个人代码片
//添加节点后,写入新的文件
@Test
public void test4()throws Exception{
//建立SAXReader对象
SAXReader reader = new SAXReader();
//读取文件 转换成Document
Document document = reader.read(new File("src/cn/com/yy/dom4j/s.xml"));
//获取根节点元素对象
Element root = document.getRootElement();
System.out.println("-------添加节点前------");
//获取节点student1
Element student1Element = root.element("student1");
//遍历
listNodes(student1Element);
//添加phone节点
Element phoneElement = student1Element.addElement("phone");
//为phone节点设置值
phoneElement.setText("137xxxxxxxx");
System.out.println("-------添加节点后------");
listNodes(student1Element);
//把student1Element写入新文件
writerDocumentToNewFile(document);
System.out.println("---写入完毕----");
}
//document写入新的文件
public void writerDocumentToNewFile(Document document)throws Exception{
//输出格式
OutputFormat format = OutputFormat.createPrettyPrint();
//设置编码
format.setEncoding("UTF-8");
//XMLWriter 指定输出文件以及格式
XMLWriter writer = new XMLWriter(new OutputStreamWriter(new FileOutputStream(new File("src/cn/com/yy/dom4j/s1.xml")),"UTF-8"), format);
//写入新文件
writer.write(document);
writer.flush();
writer.close();
}
(2)查看s1.xml文件
[html] view plaincopyprint?在CODE上查看代码片派生到个人代码片
<微信公众号>@残缺的孤独微信公众号>
<学号>20140101学号>
<地址>北京海淀区地址>
<座右铭>要么强大,要么听话座右铭>
<新浪微博>@残缺的孤独新浪微博>
<学号>20140102学号>
<地址>北京朝阳区地址>
<座右铭>在哭泣中学会坚强座右铭>
由于涉及到中文,因此在输出时要设定UTF8编码,OutputStreamWriter进行设置编码。
还有输出格式的问题,在此处使用的是 OutputFormat.createPrettyPrint(),输出文档时进行了排版格式化。还有一种是 OutputFormat.createCompactFormat()方法,输出内容是一行,没有进行格式化,是紧凑型的输出。以下:
[html] view plaincopyprint?在CODE上查看代码片派生到个人代码片
dom4j生成xml文档
1、创建一个Document对象(即一个XML文档对象),如下:
1
Document document = DocumentHelper.createDocument();
通过上面这句定义一个 XML 文档对象。
2、在创建好的Document对象上面创建一个根节点(即XML的根节点),代码如下:
1
Element root = document.addElement("根节点名称");
通过这句定义一个 XML 元素,这里添加的是根节点。
Element 有几个重要的方法:
addComment(String comment) 添加注释
addAttribute(QName qName, String value)
addAttribute(String name, String value) 添加属性
addElement(String name) 添加子元素
3、最后通过 XMLWriter 生成物理文件,默认生成的 XML 文件排版格式比较乱,可以通过 OutputFormat 类格式化输出,默认采用 createCompactFormat()显示比较紧凑, 最好使用 createPrettyPrint()。
public class TestDom4j {
public static void main(String[] args) {
// 创建文档。
Document document = DocumentHelper.createDocument();
// 设置文档DocType,这里为了举例,添加hibernate的DocType
document.addDocType("hibernate-configuration",
"-//Hibernate/Hibernate Configuration DTD 3.0//EN",
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd");
// 文档增加节点,即根节点,一个文档只能有一个根节点,多加出错
Element root = document.addElement("skills");
// 添加注释
root.addComment("第一个技能");
// 根节点下添加节点
Element first = root.addElement("skill");
// 节点添加属性
first.addAttribute("name", "独孤九剑");
// 节点下添加节点
Element info = first.addElement("info");
// 节点设置内容数据
info.setText("为独孤求败所创,变化万千,凌厉无比。其传人主要有风清扬、令狐冲。 ");
// 同理增加其他节点,内容,属性等
Element second = root.addElement("skill");
second.addAttribute("name", "葵花宝典");
Element info2 = second.addElement("info");
info2.setText("宦官所创,博大精深,而且凶险至极。练宝典功夫时,首先要自宫净身。 ");
/**
* 第二种方法增加节点,内容,属性等。先创建节点,属性,然后使用add加入。
*/
// 创建节点
Element third = DocumentHelper.createElement("skill");
// 将节点加入到根节点中
root.add(third);
// 创建属性,第一个参数指定了拥有者,也可以为null,指定拥有者
Attribute name = DocumentHelper.createAttribute(third, "name", "北冥神功");
// 将属性加入到节点上
third.add(name);
// 创建子节点并加入到节点中
Element info3 = DocumentHelper.createElement("info");
info3.setText("逍遥派的顶级内功之一,能吸人内力转化为自己所有,威力无穷。 ");
third.add(info3);
try {
// 创建格式化类
OutputFormat format = OutputFormat.createPrettyPrint();
// 设置编码格式,默认UTF-8
format.setEncoding("UTF-8");
// 创建输出流,此处要使用Writer,需要指定输入编码格式,使用OutputStream则不用
FileOutputStream fos = new FileOutputStream("d:/skills.xml");
// 创建xml输出流
XMLWriter writer = new XMLWriter(fos, format);
// 生成xml文件
writer.write(document);
writer.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
生成 XML 文件内容:
什么是WebServices?
它是一种构建应用程序的普遍模型,能够在不论什么支持网络通信的操作系统中实施执行;它是一种新的web应用程序分支,是自包括、自描写叙述、模块化的应用,能够公布、定位、通过web调用。Web Service是一个应用组件,它逻辑性的为其它应用程序提供数据与服务.各应用程序通过网络协议和规定的一些标准数据格式(Http,XML,Soap)来訪问Web Service,通过Web Service内部运行得到所需结果.Web Service能够运行从简单的请求到复杂商务处理的不论什么功能。
一旦部署以后,其它Web Service应用程序能够发现并调用它部署的服务。
关键的技术和规则
在构建和使用Web Service时,主要用到下面几个关键的技术和规则:
1.XML:描写叙述数据的标准方法.
2.SOAP:表示信息交换的协议.
3.WSDL:Web服务描写叙述语言.
4.UDDI:通用描写叙述、发现与集成,它是一种独立于平台的。基于XML语言的用于在互联网上描写叙述商务的协议。
XML
可扩展的标记语言(XML)是Web service平台中表示数据的基本格式。除了易于建立和易于分析外,XML基本的长处在于它既是平台无关的。又是厂商无关的。无关性是比技术优越性更重要的:软件厂商是不会选择一个由竞争对手所发明的技术的。
HTTP 协议是 Hyper Text Transfer Protocol(超文本传输协议)的缩写,是用于从万维网( WWW:World Wide Web )服务器传输超文本到本地浏览器的传送协议。
HTTP 是一个基于 TCP/IP 通信协议来传递数据(HTML 文件、图片文件、查询结果等)。
HTTPS 协议是 HyperText Transfer Protocol Secure(超文本传输安全协议)的缩写,是一种通过计算机网络进行安全通信的传输协议。
HTTPS 经由 HTTP 进行通信,但利用 SSL/TLS 来加密数据包,HTTPS 开发的主要目的,是提供对网站服务器的身份认证,保护交换资料的隐私与完整性。
HTTP 的 URL 是由 http:// 起始与默认使用端口 80,而 HTTPS 的 URL 则是由 https:// 起始与默认使用端口443。
HTTP 工作原理
HTTP 协议工作于客户端-服务端架构上。
浏览器作为 HTTP 客户端通过 URL 向 HTTP 服务端即 WEB 服务器发送所有请求。
Web 服务器有:Apache 服务器,IIS 服务器(Internet Information Services)等。
Web 服务器根据接收到的请求后,向客户端发送响应信息。
HTTP 默认端口号为 80,但是你也可以改为 8080 或者其他端口。
HTTP 三点注意事项:
HTTP 是无连接:无连接的含义是限制每次连接只处理一个请求,服务器处理完客户的请求,并收到客户的应答后,即断开连接,采用这种方式可以节省传输时间。
HTTP 是媒体独立的:这意味着,只要客户端和服务器知道如何处理的数据内容,任何类型的数据都可以通过HTTP发送,客户端以及服务器指定使用适合的 MIME-type 内容类型。
HTTP 是无状态:HTTP 协议是无状态协议,无状态是指协议对于事务处理没有记忆能力,缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大,另一方面,在服务器不需要先前信息时它的应答就较快。
工厂方法
如果有一个客户老王,需要购买产品,产品分别是A、B、C。
如果用传统方法实现,分别定义A、B、C三个类,再分别创建他们所属的方法。
在客户对象中再分别调用他们的方法。
Product ClientProduct(String orderType) {
Product product;
if (orderType.equals("A")) {
product = new ProductA();
} else if (orderType.equals("B")) {
product = new ProductB();
} else if (orderType.equals("B")) {
product = new ProductC();
}
// product制作过程
product.common();
return product;
}
如果我们需要再增加一个产品D,就需要判断再增加一个分支,然后在分支里面创建产品对象,调用产品D的方法。
这样代码的维护性是极差的,查看我们的软件设计七大原则,很明显,这违反了开闭原则、依赖倒置原则.
如果又有个客户小王,那么小王也必须依赖每个产品类,这样就显得冗杂。
二、简单工厂(静态工厂)
简单工厂(静态工厂)模式就应用而生了。
如果我们将产品A、B、C抽象出来一个父类,再专门创建一个工厂类,在客户购买产品时,只需要传入产品的类型,由工厂去创建产品。
简单工厂模式中包含如下角色:
Factory:工厂角色
工厂角色负责实现创建所有实例的内部逻辑。
Product:抽象产品角色
抽象产品角色是所创建的所有对象的父类,负责描述所有实例所共有的公共接口。
ConcreteProduct:具体产品角色
具体产品角色是创建目标,所有创建的对象都充当这个角色的某个具体类的实例。
看看我们对原始实现方式后的代码。
产品抽象父类:
/**
* @author tcy
* @Date 28-07-2022
*/
public class Product {
public void common(){
System.out.println("这是产品父类公共方法...");
}
}
产品A:
/**
* @author tcy
* @Date 28-07-2022
*/
public class ProductA extends Product{
public void common(){
System.out.println("这是产品A方法...");
}
}
产品B:
/**
* @author tcy
* @Date 28-07-2022
*/
public class ProductB extends Product{
public void common(){
System.out.println("这是产品B方法...");
}
}
工厂类:
/**
* @author tcy
* @Date 28-07-2022
*/
public class SimpleFactory {
public Product createProduct(String orderType) {
Product product = null;
if (orderType.equals("A")) {
product = new ProductA();
} else if (orderType.equals("B")) {
product = new ProductB();
} else if (orderType.equals("C")) {
product = new ProductC();
}
return product;
}
}
客户老王类:
/**
* @author tcy
* @Date 28-07-2022
*/
public class Client {
SimpleFactory simpleFactory;
public Client(SimpleFactory simpleFactory) {
this.simpleFactory = simpleFactory;
}
public Product orderProduct(String orderType) {
Product product;
product = simpleFactory.createProduct(orderType);
//调用每个产出相应的方法
product.common();
System.out.println(product.getClass());
return product;
}
public static void main(String[] args) {
Client client=new Client(new SimpleFactory());
client.orderProduct("A");
}
}
1.HTTP的请求方法经常使用的有GET和POST:网络
GET:请求URL并获得资源,初级理解为下载;异步
POST:向服务器添加新的内容,可理解为上传。spa
2.网络链接方式:代理
同步:发送同步消息后只能等待服务器返回消息,期间不能执行任何动做,表现为UI的冻结。对象
异步:向服务器发送异步消息后仍可执行其余操做,使用代理等待服务器返回消息,UI不冻结。资源
下面介绍四种经常使用连接方式:同步
1.GET同步io
(1)系统封装好的GET请求的同步连接方式有:table
NSString、NSData、NSArray、UIImage等类。
(2)手动建立一个GET同步连接的步骤:
.建立URL对象
.建立NSURLRequest对象
.建立NSURLConnection对象,发送同步连接
.接收数据
2.POST同步
.建立URL对象
.建立NSMutableURLRequest对象
.建立NSURLConnection对象,发送同步连接
.设置请求方式为POST(系统默认的请求方式为GET)
.接收数据
3.GET异步
.建立URL对象
.建立NSURLRequest对象
.建立NSURLConnection对象,设置代理(一般使用系统自己写好的代理,使类遵循某个协议即可以使用协议里面的方法),发送同步连接
.在代理的方法里实现接收数据
4.POST异步
.建立URL对象
.建立NSMutableURLRequest对象
.建立NSURLConnection对象,设置代理(一般使用系统自己写好的代理,使类遵循某个协议即可以使用协议里面的方法),发送同步连接
.设置请求方式为POST(系统默认的请求方式为GET)
.在代理的方法里实现接收数据