1. xml简介
xml: (Extensible Markup Language)可扩展标记语言
2. xml中的标签
-
单标签
<标签名称/>
-
双标签
<标签名称></标签名称>
3. xml的规范
-
xml是区分大小写
-
xml的标签名称可以是任意的
-
xml单标签必须写 /
-
xml的标签名称一般建议使用小写英文
-
xml的开头必须是声明部分
<?xml version="1.0" encoding="utf-8" ?>
-
xml的根标签必须是唯一的
4. xml的用处
- 用于互联网通信中的数据传输(一般4,5年前都这样做,现在都使用
json
),无效数据太多了 - 可以用于项目的配置文件
5. 在idea中编写xml
6. xml与html的区别在哪
html就是加了html约束的xml
Hyper Text Markup Language html
7. xml的约束(了解)
-
dtd
-
schema
8. xml的内容读取方式
- 使用原始的io流读取文件内容
- 使用jdk自带的解析xml的方式
- dom解析(重要)
- sax解析(了解)
- 使用第三方优秀的解析方式来解析xml(重要)
package com.tony.xml.demo;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
/**
* 使用IO流读取文件内容
*/
public class IoOps {
public static void main(String[] args) throws IOException {
FileReader fileReader = new FileReader("books.xml");
BufferedReader bufferedReader = new BufferedReader(fileReader);
String line = null;
StringBuffer sb = new StringBuffer();
while ((line = bufferedReader.readLine())!=null){
sb.append(line);
}
System.out.println(sb.toString());
}
}
9. 使用dom解析xml
dom方式解析xml是把xml加载到内存中形成树结构;
好处: 便于理解,解析速度快
弊端: 当文档过大时会出现内存溢出
package com.tony.xml.demo;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import java.io.File;
/**
* 使用Dom解析xml
*/
public class DomOps {
public static void main(String[] args) throws Exception {
File file = new File("books.xml");
//1. 创建dom解析器工厂
DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
//2. 使用解析器工厂创建解析器
DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
//3. 使用解析器来解析xml
Document document = documentBuilder.parse(file);
//4. 获取根节点
Element rootElement = document.getDocumentElement();
//5. 获取子节点或者属性
NodeList bookNodes = rootElement.getChildNodes();
//6. 遍历所有的books的子节点
for (int i = 0; i < bookNodes.getLength(); i++) {
//7. 筛选出元素节点(<book></book>)
if (bookNodes.item(i).getNodeType() == Node.ELEMENT_NODE) {
//7.1 我们在这完全就可以把Node--转换为-->Element
Element bookElement = (Element) bookNodes.item(i);
//7.2 获取book元素的id属性
System.out.println(bookElement.getAttribute("id"));
//7.3 获取book的所有子节点
NodeList bookChildNodes = bookElement.getChildNodes();
//7.4 遍历所有的book的子节点
for (int j = 0; j < bookChildNodes.getLength(); j++) {
//7.4.1 筛选出元素节点 <name></name> <author></author> <price></price>
if (bookChildNodes.item(j).getNodeType() == Node.ELEMENT_NODE) {
//7.4.1.1 如果执行到这里,则说明Node是 Element(元素)
Element infoElement = (Element) bookChildNodes.item(j);
System.out.print(infoElement.getNodeName());
//7.4.1.2 获取name|author|price的子节点,即name author price中的文本
Node textNode = infoElement.getFirstChild();
//7.4.1.3 获取文本节点的值
System.out.println("=>" + textNode.getNodeValue());
}
}
}
}
}
}
10.Sax解析(了解)
基于事件驱动的模型进行xml解析;
好处:不会出现内存溢出
弊端:不容易理解
package com.xzy;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import java.io.File;
/**
* Sax解析
*/
public class SaxOps {
public static void main(String[] args) throws Exception {
File file = new File("books.xml");
//1. 创建sax解析器工厂
SAXParserFactory saxParserFactory = SAXParserFactory.newInstance();
//2. 使用解析器工厂创建sax解析器
SAXParser saxParser = saxParserFactory.newSAXParser();
//3. 使用解析器解析xml
saxParser.parse(file, new DefaultHandler() {
@Override
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
System.out.println("标签开始解析:" + qName);
if (qName.equals("book")) {
System.out.println(attributes.getValue("id"));
}
}
@Override
public void endElement(String uri, String localName, String qName) throws SAXException {
System.out.println("标签结束解析:" + qName);
}
@Override
public void characters(char[] ch, int start, int length) throws SAXException {
System.out.println("内容:" + new String(ch, start, length));
}
});
}
}
11. Dom解析与Sax解析的区别
- dom解析是把整合xml文件加载到内存中,如果文件过大,可能会出现内存溢出的问题
- sax解析是基于事件驱动模型的,不会把整个文档全部加载到内存中,不会出现内存溢出
- dom适合解析小xml文件,sax适合解析大的xml文件;
- 一般没有特殊需求选择dom
12. Dom4j解析xml
- dom4j是一个优秀的开源项目
- 我们在实际的商业应用中一般都会使用dom4j解析xml
package com.tony.xml.demo;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import java.io.File;
import java.util.List;
/**
* 使用Dom4j解析xml
*/
public class Dom4jOps {
public static void main(String[] args) throws DocumentException {
//1.创建Dom4j的解析器
SAXReader saxReader = new SAXReader();
//2.解析xml
Document document = saxReader.read(new File("books.xml"));
//3.获取根节点
Element rootElement = document.getRootElement();
//4.获取子节点
List bookElementList = rootElement.elements("book");
//5.遍历每一个book元素
bookElementList.forEach(bookElementNode -> {
//5.1强制类型转换
Element bookElement = (Element) bookElementNode;
//5.2获取属性
System.out.println(bookElement.attributeValue("id"));
//5.3获取book元素下面的name元素
Element nameElement = bookElement.element("name");
//5.4获取name元素的内容
System.out.println(nameElement.getStringValue());
//5.5获取book元素下面的author元素
Element authorElement = bookElement.element("author");
//5.6获取author元素的内容
System.out.println(authorElement.getStringValue());
//5.7获取book元素下面的price元素
Element priceElement = bookElement.element("price");
//5.8获取price元素的内容
System.out.println(priceElement.getStringValue());
});
}
}
13. Xpath解析xml
/:
表达式的开头: 代表文档的/
不是表达式的开头: 代表 "子"
//:
表达式的开头: 代表任意位置
不是表达式的开头: 代表 "后代"
@属性名称: 获取属性节点
text();获取文本节点
package com.tony.xml.demo;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Node;
import org.dom4j.io.SAXReader;
import java.io.File;
/**
* 使用Xpath解析xml
*/
public class XpathOps {
public static void main(String[] args) throws DocumentException {
//1.创建解析器
SAXReader saxReader = new SAXReader();
//2.使用解析器解析文档
Document document = saxReader.read(new File("books.xml"));
Node node1 = document.selectSingleNode("/books/book[@id=100]");
System.out.println(node1.getStringValue());
Node node2 = document.selectSingleNode("/books/book[@id=100]/price/text()");
System.out.println(node2.getStringValue());
}
}
14.其他的xml解析方式
- jdom解析
- pull解析
- …
15. B/S架构
服务器 = 服务器软件+高配主机
数据库服务器 = mysqlserver+主机
16. http协议
请求数据包 = 请求行+请求头+请求实体
响应数据包 = 响应行+响应头+响应实体
请求数据包:
GET http://172.18.0.4/a70.htm?mv6=2001:0da8:4004:0255:e01d:8e51:d6b3:d954&url=http://www.xupt.edu.cn/ HTTP/1.1
Host: 172.18.0.4
Connection: keep-alive
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.72 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8
请求方式 请求url 协议的版本
key1: value1
key2: value2
key3: value3
请求实体(get请求不能有请求实体)
响应数据包
HTTP/1.1 200 OK
Server: DrcomServer1.0
Connection: keep-alive
Accept-Ranges: bytes
Content-Type: text/html
Cache-Control: no-cache
Content-Length: 4359
<!doctype html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<meta id="viewport" name="viewport" content="target-densitydpi=device-dpi,width=640px,user-scalable=1">
<meta http-equiv="X-UA-Compatible" content="IE=9; IE=8; IE=7; IE=EDGE">
<title>上网登录窗</title>
<!--Dr.COMWebLoginID_0.htm-->
<link rel="stylesheet" type="text/css" href="b82.css" />
<script type="text/javascript" src="a42.js"></script>
<script>
document.write('<script language=javascript src="a41.js?version=1.4_'+(new Date()).valueOf()+'"><\/script>');
document.write('<script language=javascript src="'+window.location.protocol + '//' + window.location.hostname + ':801/eportal/extern/xupt-20171115/config.js?version=1.4_'+(new Date()).valueOf()+'"><\/script>');
</script>
<script language="javascript">
sv=1;sv1=0;v6='http://[2001:da8:4004::998:4]:9002/v6 ';myv6ip=' ';v4serip='172.18.0.4' ;m46=0;v46ip='222.24.3.224' ;
vid=0 ;mip=222024003224;Gno=0000;vlanid="0" ;AC=""; ipm="ac120004";ss1="000d48466603";ss2="0000";ss3="de1803e0";ss4="000000000000";ss5="222.24.3.224" ;ss6="172.18.0.4" ;timet=00000000000;
osele=0;//1=不弹窗
domain='[2001:da8:4004::998:4]';// //
var programUrl = window.location.protocol + "//" + window.location.hostname + ":801/eportal/extern/xupt-20171115/";
newComm.setArgsCookies(programUrl,vlanid,ss5);
//判断pc/手机
if(normalFun.getTermType() == 2){
newComm.setNessArg('mobile');
}else{
newComm.setNessArg('pc');
}
newComm.setNessJs();
//广告统计设置
hnaSetAdCount('1000', ss4, '', ss5, ss4);
</script>
</head>
<body>
</body>
</html>
<script type="text/javascript">
$(function(){
newComm.setNessSett();
//自动登录初使化
autoLoginObj.autoLogin();
// 检查是否保存密码
savePassword.check();
//我已经阅读声明
checkIReadObj.initialize();
//公共账号登录的配置
commonAccount.initialize();
//发送短信
smsSend.initialize();
//HNA 切换 a70 与 a30
qrCode.initJump();
//自定义无感知初始化
checkPerceivebj.initialize();
//微信认证
if(normalFun.getQueryString('wechat')==1){
document.body.style.display='none';
//portal
if(newComm.loginMethod == 1){
var GoTo = window.location.protocol + "//" + window.location.hostname+":801/eportal/?c=ACSetting&a=Login"+"&wlanuserip="+normalFun.getQueryString('wlanuserip')+"&wlanacip="+normalFun.getQueryString('wlanacip')+"&wlanacname="+normalFun.getQueryString('wlanacname')+"&port="+window.location.port+"&iTermType="+normalFun.getTermType()+"&mac="+normalFun.getCurrMAC()+"&ip="+normalFun.getCurrIP()+"&redirect="+normalFun.getQueryString('redirect')+"&session="+normalFun.getQueryString('session')+"&wechat_version="+com_version+"&commonUsername="+com_username+"&commonPassword="+com_password;
//window.location = GoTo;
document.write("<form name='wxform' method='post' action='"+GoTo+"'>");
document.write("<input type='hidden' name='DDDDD' value='"+normalFun.getQueryString('DDDDD')+"' >");
document.write("<input type='hidden' name='upass' value='"+normalFun.getQueryString('upass')+"' >");
document.write("<input type='hidden' name='R1' value='0' >");
document.write("<input type='hidden' name='R2' value='' >");
document.write("<input type='hidden' name='R6' value='1' >");
document.write("<input type='hidden' name='para' value='00' >");
document.write("<input type='hidden' name='0MKKey' value='123456' >");
document.write("</form>");
document.wxform.submit();
}else{
GoTo = 'http://'+window.location.hostname+'/login?DDDDD='+normalFun.getQueryString('DDDDD')+'&upass='+normalFun.getQueryString('upass')+'&0MKKey=login';
window.location=GoTo;
}
}
//mac_guest登录
$('[name=mac_guestlogin]').on('click', function () {
var mac = normalFun.getQueryString('ss4') || (("undefined" != typeof ss4)?ss4:"000000000000");
if(mac.indexOf('-')>=0)mac = mac.replace(/-/g,'');
if(mac.indexOf(':')>=0)mac = mac.replace(/:/g,'');
window.location = 'http://'+window.location.hostname+'/login?DDDDD='+mac+"_guest"+'&upass='+"123456"+'&0MKKey=login';
});
//v6参数加载
on_load();
});
</script>
http协议的版本 响应码 响应信息
key1: value1
key2: value2
key3: value3
响应实体
17. http的请求方式
- get
- post
- put
- delete
- head
- option
- …
18. Http协议的版本
- http1.0
- http1.1
19. http响应码
200 OK : 请求被成功的处理并且正确的返回
302 Found : 一般与响应头Location配合使用实现"请求重定向"
304 Not Modified : 一般用来实现缓存
404 Not Found: 找不到资源
405 Method Not Allowed: 请求不允许
500 Internal Server Error :服务端代码错误
502 Bad Gateway: 坏请求
504 Gateway Time-out : 网络超时
505 HTTP Version not supported : 协议版本不匹配
....