网页解析的全经过,HTTP完整请求进程

输入url用户按下回车键
主要的流水生产线下边这张图已经十二分显明了。下图根本通过Navigation Timing
API在客户端收罗品质数据,并用XMLHttpRequest 或任何才干传送到服务端。同时,该API使您能够度量在此之前难以赢得的多寡,如卸载前三个页面包车型大巴时刻,在域名解析上的时刻,在实行load事件管理器上开销的总时间等。

1.用户输入网址,浏览器发起DNS查询请求

一.用户输入网站,浏览器发起DNS查询请求

珍视发明:感激原作小编——沐风的心,想看原稿请戳这里!笔者借鉴了初稿的页面请求流程,最初的小说见时序图之后正文。

亚洲必赢官网 1

用户访问网页,DNS服务器(域名解析系统)会基于用户提供的域名查找对应的IP地址。

用户访问网页,DNS服务器(域名解析系统)会依附用户提供的域名查找对应的IP地址。

注重发明:多谢原著作者——一行两行,想看原稿请戳这里!笔者借鉴了初稿的1体化HTTP请求流程。

从上到下依照事件爆发的先后顺序,这一个事件的列表如下:

域名解析服务器是基于UDP协议得以落成的3个应用程序,平常经过监听伍叁端口来获得客户端的域名解析呼吁。DNS查找进程如下:

域名解析服务器是基于UDP协议落到实处的多少个应用程序,常常经过监听5三端口来收获客户端的域名解析呼吁。DNS查找进程如下:

充实了时序图,有不妥之处,招待指正~~
(未完待续,供给扩充后端服务器框架之中管理)

navigationStart 加载起始时间
redirectStart 重定向开始时间(如果发生了HTTP重定向,每次重定向都和当前文档同域的话,就返回开始重定向的fetchStart的值。其他情况,则返回0)
redirectEnd 重定向结束时间(如果发生了HTTP重定向,每次重定向都和当前文档同域的话,就返回最后一次重定向接受完数据的时间。其他情况则返回0)
fetchStart 浏览器发起资源请求时,如果有缓存,则返回读取缓存的开始时间
domainLookupStart 查询DNS的开始时间。如果请求没有发起DNS请求,如keep-alive,缓存等,则返回fetchStart
domainLookupEnd 查询DNS的结束时间。如果没有发起DNS请求,同上
connectStart 开始建立TCP请求的时间。如果请求是keep-alive,缓存等,则返回domainLookupEnd
(secureConnectionStart) 如果在进行TLS或SSL,则返回握手时间
connectEnd 完成TCP链接的时间。如果是keep-alive,缓存等,同connectStart
requestStart 发起请求的时间
responseStart 服务器开始响应的时间
domLoading 浏览器把document.readyState设置为“loading”的时间点,开始构建dom树的时间点;
domInteractive 浏览器把document.readyState设置为“interactive”的时间点,DOM树创建结束;
domContentLoadedEventStart 开始触发DomContentLoadedEvent事件的时间
domContentLoadedEventEnd DomContentLoadedEvent事件结束的时间
domComplete 从图中看是dom渲染完成时间,浏览器把document.readyState设置为“complete”的时间点;
loadEventStart 触发load的时间,如没有则返回0
loadEventEnd load事件执行完的时间,如没有则返回0
unloadEventStart unload事件触发的时间
unloadEventEnd unload事件执行完的时间

浏览器缓存
– 浏览器会缓存DNS记录一段时间。
有意思的是,操作系统未有报告浏览器积累DNS记录的时刻,那样不一致浏览器会积累个自固定的二个时刻(2分钟到27分钟不等)。

浏览器缓存
– 浏览器会缓存DNS记录1段时间。
有意思的是,操作系统没有告诉浏览器积攒DNS记录的岁月,那样分裂浏览器会积存个自固定的多个时间(贰分钟到2八分钟不等)。

亚洲必赢官网 2

本来这几个api包容性

系统缓存 –
假使在浏览器缓存里不曾找到必要的记录,浏览器会做叁个种类调用(windows里是gethostbyname)。那样便可获取系统缓存中的记录。

系统缓存 –
假若在浏览器缓存里不曾找到需求的笔录,浏览器会做三个连串调用(windows里是gethostbyname)。那样便可收获系统缓存中的记录。

一、引言

前端不仅要让用户对网页有宏观的感受,让用户尽快体验到周到的网页也是很要紧的,那就要前端程序猿精通一些互联网原理相关的学识了。这里就来聊壹聊从用户输入
url 到页面加载成功的进度中都发出了什么样职业?

亚洲必赢官网 3

路由器缓存 –
接着,前边的查询请求发向路由器,它一般会有和好的DNS缓存。

路由器缓存 –
接着,前边的查询请求发向路由器,它一般会有友好的DNS缓存。

二、正文

用户输入 url 之后差不多产生了以下几件事:

  1. 浏览器查找域名的 IP 地址。这一步包罗 DNS
    具体的索求进度,包含:浏览器缓存 -> 系统缓存 -> 路由器缓存……
  2. 浏览器向 web 服务器发送八个 http
    请求:一遍握手、传送数据、4次挥手;
  3. 服务器的不可磨灭重定向响应:再次来到真正访问的地点;
  4. 浏览器追踪重定向地址:另发2个 http 请求;
  5. 服务器管理请求;
  6. 服务器重临三个 http 响应;
  7. 浏览器展现 html 页面:解析 html 以构建 DOM 树 –> 创设渲染树
    –> 布局渲染树 –> 绘制渲染树;
  8. 浏览器发送请求,获取嵌入在 html
    中的财富(如图片、音频、录像、CSSJS 等等);
  9. 浏览器发送异步请求。

顺便附上 http 状态码 (别的状态码的实际情况,请戳这里):

http 状态码 详细状态码 状态原因
1xx 消息
2xx 成功
3xx 重定向
4xx 客户端错误
5xx 服务器错误
5xx 500 接口报错了
5xx 502 后端服务没启
5xx 503 启动挂了

上边我们就详细地问询一下这么些进程:

 

ISP DNS
缓存 –
接下来要check的就是ISP缓存DNS的服务器。在这貌似都能找到呼应的缓存记录。

ISP DNS
缓存 –
接下来要check的正是ISP缓存DNS的服务器。在这一般都能找到相应的缓存记录。

1. DNS 查找 IP 地址

DNS域名种类 (Domain Name System)
的缩写,是因特网的一项宗旨服务。它作为能够将域名和 IP
地址相互映射的三个布满式数据库,能够使人更利于的拜访互连网,而不用去记住能够被机器直接读取的
IP 数字串。

  1. DNS 查找进程:

    1. 浏览器缓存 —— 浏览器会缓存 DNS
      记录一段时间,可是操作系统并从未报告浏览器积存 DNS
      记录的时日。于是,不相同浏览器会积存各自的多少个定点时间( 2 分钟到
      30 分钟不等)
    2. 系统缓存
      如若在浏览器缓存里不曾找到供给的记录,浏览器会做3个种类调用
      Windows 里是 gethostbyname
      ,这样便可获取并询问系统缓存中的记录。
    3. 路由器缓存
      接着,前边的查询请求发向路由器。路由器一般会有本身的 DNS
      缓存。
    4. ISP DNS缓存 – 接下来要 check 的就是 ISP 缓存 DNS
      的服务器。ISP (Internet Service Provider)
      就是网络服务提供商,在那貌似都能找到相应的缓存记录。
    5. 递归寻觅 – 你的 ISP网页解析的全经过,HTTP完整请求进程。 的 DNS
      服务器从跟域名服务器先导展开递归寻觅,从 .com 拔尖域名服务器到
      example 的域名服务器。一般 DNS 服务器的缓存中会有 .com
      域名服务器中的域名,所以到拔尖服务器的相称进度不是那么须求了。
  2. DNS 举行域名解析的经过

    1. 客户端发出 DNS 请求翻译 IP 地址或主机名;
    2. DNS 服务器在收到客户端的呼吁后,检查 DNS
      服务器的缓存,若查到请求的地方或名字,即向客户端发出回应消息;
    3. 若未有查到,则在数据库中追寻,若查到请求的地点或名字,即向客户端发出回应音信;
    4. 若未有查到,则将请求发给根域 DNS
      服务器,并依序从根域查找顶尖域,由一流查找二级域,二级域查找三级,直至找到要分析的地点或名字。然后,向客户端所在网络的
      DNS 服务器发出回应新闻,DNS
      服务器收到回复后,先在缓存中存款和储蓄,然后,将分析结果发给客户端。
    5. 若未有找到,则赶回错误音讯。

   上边已经将浏览器的进行进度轻易实行分析,下边作者在捋1捋整个工艺流程

递归搜索 –
你的ISP的DNS服务器从跟域名服务器开始举行递归寻觅,从.com一级域名服务器到脸谱的域名服务器。一般DNS服务器的缓存中会有.com域名服务器中的域名,所以到五星级服务器的相配进程不是那么须求了。

递归找出 –
你的ISP的DNS服务器从跟域名服务器早先进行递归寻找,从.com一流域名服务器到推特(TWTR.US)的域名服务器。一般DNS服务器的缓存中会有.com域名服务器中的域名,所以到顶尖服务器的相称进度不是那么要求了。

2. http请求

  1. 2回握手创立 TCP 连接

    http
    职业伊始以前,浏览器首先要经过网络与服务器构建连接,该连接是透过
    TCP 来达成的。该协议与 IP 协议员联盟手创设 Internet ,即有名的
    TCP/IP 协议族,因此 Internet 又被称作是 TCP/IP 网络。 http
    是比 TCP
    越来越高档次的应用层协议
    。依据规则,只有低层协议创立之后才干拓展更加高次层协议的连年。因而,首先要确立
    TCP 连接,一般 TCP 连接的端口号是 80 。在 TCP/IP
    协议中,TCP 协议提供保障的连天服务,选择二次握手营造三个接二连三:

    1. 首先次握手:创设连接时,客户端发送 SYN 包到服务器,并跻身
      SYN_SENT
      状态,等待服务器确认;SYN:同步系列编号(Synchronize Sequence
      Numbers)
    2. 其次次握手:服务器收到 SYN 包,必须认可客户的
      SYN,同时和睦也发送叁个 SYN 包,即 SYN+ACK
      包,此时服务器进入 SYN_RECV 状态;
    3. 其贰遍握手:客户端收到服务器的 SYN+ACK 包,向服务器发送确认包
      ACK,此包发送落成,客户端和服务器进入
      ESTABLISHED处境,达成一回握手。

    完结三回握手,客户端与服务器起头传送数据。

    假使确立了 TCP 连接,浏览器就能够向服务器发送 http
    请求命令。浏览器发送其请求命令之后,还要以头音讯的款型向服务器发送一些别的消息。此后,浏览器发送了1空白行来打招呼服务器,它曾经收尾了该头新闻的出殡和埋葬。

  2. 六回挥手终止连接

    由于 TCP
    连接是全双工的,由此各类方向都无法不独立开始展览关闭。原则是当一方完结它的多寡发送职分后,就可以发送多少个
    FIN 来终止那几个样子的一连。收到3个 FIN
    只意味着这一大方向上从没有过多少流动。3个 TCP 连接在吸收二个 FIN
    后仍是可以发送数据。首先进行停业的一方将实践积极关闭,而另壹方施行被动关闭。

    1. 首先次挥手:TCP 客户端发送贰个
      FIN,用来关闭客户端到服务器的多少传送。
    2. 第一遍挥手:服务器收到那一个 FIN,它发回三个
      ACK,确认序号为收到的序号加 1 。和 SYN 一样,一个 FIN
      将占有二个序号。
    3. 其一回挥手:服务器关闭客户端的连接,发送三个 FIN 给客户端。
    4. 第14次挥手:客户端发回 ACK
      报文确认,并将确认序号设置为收到序号加 1
  • 用户输入浏览器网址(www.itwangziye.top),按下回车
  • 第三步浏览器有个一个起动时间,然后进入到重定向流程
  • 万①未有重定向,直接进入DNS流程
    • 浏览器缓存 – 浏览器会缓存DNS记录一段时间。
      有趣的是,操作系统未有告诉浏览器储存DNS记录的时光,那样差异浏览器会积攒个自固定的3个光阴(贰分钟到28秒钟不等)。
    • 系统缓存 –
      就算在浏览器缓存里未有找到须求的记录,浏览器会做七个种类调用(windows里是gethostbyname)。那样便可获取系统缓存中的记录。
    • 路由器缓存 –
      接着,前面包车型客车询问请求发向路由器,它一般会有谈得来的DNS缓存。
    • ISP DNS 缓存 –
      接下来要check的便是ISP缓存DNS的服务器。在这一般都能找到呼应的缓存记录。
    • 递归寻觅 –
      你的ISP的DNS服务器从跟域名服务器初叶张开递归寻觅,从.top顶尖域名服务器到域名服务器。一般DNS服务器的缓存中会有.com域名服务器中的域名,所以到一流服务器的合营进度不是那么须要了。
  • 搜寻到财富后向web服务器发送http请求,创制TCP连接,起始获得能源,假设有缓存间接跳过(协商缓存和强缓存)

2、建立TCP连接

2、建立TCP连接

叁. 服务器的永远重定向响应

服务器给浏览器响应八个 301 永恒重定向响应,那样浏览器就能够造访
而非

为什么服务器一定要重定向而不是一贯发会用户想看的网页内容呢?那个主题材料有为数不少有趣的答案。

里头2个原因跟探求引擎排行有关。你看,假设1个页面有三个地点,就好像

,寻觅引擎会认为它们是八个网址,结果产生每1个的追寻链接都压缩从而降低排行。而追寻引擎知道
301 永远重定向是什么样意思,那样就会把走访带 www 的和不带 www
的地址归到同二个网址排行下。

再有1个缘故是用分歧的地址会促成缓存友好性变差。当三个页面有好几个名字时,它或然会在缓存里冒出一些次。

浏览器通过DNS获取到web服务器真的IP地址后,便向web服务器发起tcp连接请求,通过TCP1回握手创立好连接后,浏览器便得以将HTTP请求数据经过发送给服务器了。

浏览器通过DNS获取到web服务器真的IP地址后,便向web服务器发起tcp连接请求,通过TCP二次握手创立好连接后,浏览器便能够将HTTP请求数据经过发送给服务器了。

肆. 浏览器追踪重定向地址

昨日,浏览器知道了
才是要访问的不易地址,所以它会发送另3个拿走请求。

  • 服务器收到请求管理后再次来到二个响应(既这里状态码为200)

 

 

5. 服务器“处理”请求

服务器收到到收获请求,然后管理并赶回叁个响应。

HTTP/1.1 200 OK
Cache-Control: private, no-store, no-cache, must-revalidate,
post-check=0,
pre-check=0
Expires: Sat, 01 Jan 2000 00:00:00 GMT
P3P: CP=”DSP LAW”
Pragma: no-cache
Content-Encoding: gzip
Content-Type: text/html; charset=utf-8
X-Cnection: close
Transfer-Encoding: chunked
Date: Fri, 12 Feb 2010 09:05:55 GMT

三、浏览器向 web
服务器发送三个 HTTP 请求

三、浏览器向 web
服务器发送八个 HTTP 请求

六. 页面渲染

当代浏览器渲染页面包车型客车经过是那般的:解析 html 以构建 DOM 树 –>
构建渲染树 –> 布局渲染树 –> 制图渲染树

DOM 树是由 html 文件中的标签排列组合。

渲染树是在 DOM 树中参加 csshtml 中的 style
样式而变成。渲染树只包罗必要体未来页面中的 DOM 元素,像 <head>
元素或 display 属性值为 none
的要素都不在渲染树中。在浏览器还没接到到总体的 html
文件时,它就起来渲染页面了。

在遇到表面链入的本子标签、样式标签、图片时,会重复发送 http
请求重复上述的手续。在接受 css
文件后,会对曾经渲染的页面重新渲染,出席它们应有的样式。图片文件加载完,马上呈现在对应岗位。在那壹经过中可能会触发页面包车型地铁重绘或重排亚洲必赢官网,。

2b3Tn@[…]

HTTP请求是一个依照TCP协议之上的应用层协议——超文本传输协议。多少个http事务由一条(从客户端发往服务器的)请求命令和一个(从服务器发回客户端的)响应结果组成。

HTTP请求是三个基于TCP协议之上的应用层协议——超文本传输协议。三个http事务由一条(从客户端发往服务器的)请求命令和2个(从服务器发回客户端的)响应结果组成。

三、结语

做前端不仅要调控前端的学识,对有个别前端相关的举个例子说Computer网络、数据结构、Computer原理都要有一定的问询,因为互连网世界连接在联合签名的,前端与那么些文化都以有接触的,说不准什么日期就能够用上。而且,学好那一个文化,对前者优化也有非常的大的支援。

——————— 本文来源 沐风的心 的CSDN 博客
,全文地址请点击:

  • 浏览器发轫显得HTML,浏览器未有收受完全的html文书档案,开始突显页面,初阶读取js,css,图片等能源。
  • 每一种财富都要进行呼吁,获取财富(页面实行回流和追忆)
  • 由来整个工艺流程截至
GET http://www.cricode.com/ HTTP/1.1
Host: www.cricode.com
Connection: keep-alive
Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
User-Agent: Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.114 Safari/537.36
Accept-Encoding: gzip,deflate,sdch
Accept-Language: zh-CN,zh;q=0.8
GET http://www.cricode.com/ HTTP/1.1
Host: www.cricode.com
Connection: keep-alive
Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
User-Agent: Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.114 Safari/537.36
Accept-Encoding: gzip,deflate,sdch
Accept-Language: zh-CN,zh;q=0.8

浏览器缓存

浏览器第三次呼吁时:

 亚洲必赢官网 4

 

 浏览器后续在开始展览呼吁时:

亚洲必赢官网 5

 

 

  

  

浏览器回流回溯

  1. 当render
    tree中的一有的(或任何)因为成分的规模尺寸,布局,隐藏等转移而急需再一次创设。那就叫做回流。每种页面至少须求1回回流,便是在页面第叁次加载的时候。

  2. 当render
    tree中的一些因素需求立异属性,而那几个属性只是影响因素的外观,风格,而不会潜移默化布局的,举例background-color。则就叫称为重绘。

注:回流必将唤起重绘,而重绘不必然会唤起回流。

 

 

4、发送响应数据给客户端

4、发送响应数据给客户端

Web服务器平日经过监听80端口,来赢得客户端的HTTP请求。与客户端创建好TCP连接后,web服务器发轫收受客户端发来的多寡,并通过HTTP解码,从收受到的互联网数据中剖析出请求的url消息此前别的诸如Accept-Encoding、Accept-Language等音讯。Web服务器依照HTTP请求头的消息,得到响应数据再次回到给客户端。三个头一无二的HTTP响应头数据报如下:

Web服务器常常经过监听80端口,来赢得客户端的HTTP请求。与客户端创建好TCP连接后,web服务器初步收受客户端发来的多寡,并透过HTTP解码,从收受到的网络数据中剖析出请求的url新闻从前其余诸如Accept-Encoding、Accept-Language等新闻。Web服务器依照HTTP请求头的音讯,获得响应数据再次回到给客户端。3个杰出的HTTP响应头数据报如下:

HTTP/1.1 200 OK
Date: Fri, 24 Oct 2014 13:55:18 GMT
Server: Apache
X-Powered-By: PHP/5.4.32
Keep-Alive: timeout=5, max=10000
Connection: Keep-Alive
Transfer-Encoding: chunked
Content-Type: text/html; charset=UTF-8
a0f6
<!DOCTYPE HTML>
<html>
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=10,IE=9,IE=8">
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=0, minimum-scale=1.0, maximum-scale=1.0">
<title></title>
<body class="home"></body>
</html>
HTTP/1.1 200 OK
Date: Fri, 24 Oct 2014 13:55:18 GMT
Server: Apache
X-Powered-By: PHP/5.4.32
Keep-Alive: timeout=5, max=10000
Connection: Keep-Alive
Transfer-Encoding: chunked
Content-Type: text/html; charset=UTF-8
a0f6
<!DOCTYPE HTML>
<html>
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=10,IE=9,IE=8">
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=0, minimum-scale=1.0, maximum-scale=1.0">
<title></title>
<body class="home"></body>
</html>

  

  

迄今,三个HTTP通讯进程做到。web服务器会基于HTTP请求头中的Connection字段值决定是不是关闭TCP链接通道,当Connection字段值为keep-alive时,web服务器不会立马关闭此几次三番。(这一步一初阶容许还会有重定向及浏览器追踪重定向地址等)。

时至前日,叁个HTTP通讯进程完毕。web服务器会依照HTTP请求头中的Connection字段值决定是或不是关闭TCP链接通道,当Connection字段值为keep-alive时,web服务器不会立即关闭此接二连三。(这一步一方始容许还会有重定向及浏览器跟踪重定向地址等)。

五、浏览器解析http
response

伍、浏览器解析http
response

(1)html文书档案解析(DOM
Tree)

(一)html文书档案解析(DOM
Tree)

在浏览器未有完好接受一切HTML文书档案时,它就已经起来显得那几个页面了。生成解析树即dom树,是由dom成分及质量节点组成,树的根是document对象。

在浏览器未有完全接受全部HTML文书档案时,它就早已起来体现那个页面了。生成解析树即dom树,是由dom成分及质量节点组成,树的根是document对象。

(贰)浏览器发送获取嵌入在HTML中的对象

(2)浏览器发送获取嵌入在HTML中的对象

加载进程中蒙受外部css文件,浏览器其余发出三个请求,来得到css文件。境遇图片财富,浏览器也会其它发出2个伸手,来获取图片能源。那是异步请求,并不会潜移默化html文书档案实行加载。

加载进程中境遇外部css文件,浏览器其余发出二个请求,来获取css文件。蒙受图片能源,浏览器也会其它发出叁个呼吁,来收获图片财富。那是异步请求,并不会影响html文书档案举办加载。

然则当文书档案加载进度中相遇js文件,html文书档案会挂起渲染(加载解析渲染同步)的线程,不仅要等待文书档案中js文件加载达成,还要等待解析实施完成,才足以回复html文书档案的渲染线程。

唯独当文档加载进度中遇见js文件,html文书档案会挂起渲染(加载解析渲染同步)的线程,不仅要等待文书档案中js文件加载达成,还要等待解析施行完毕,才足以回复html文书档案的渲染线程。

(3)css解析(parser
Render Tree)

(3)css解析(parser
Render Tree)

浏览器下载css文件,将css文件分析为样式表对象,并用来渲染dom
tree。该目的涵盖css规则,该规则包罗选择器和表明对象。

浏览器下载css文件,将css文件分析为样式表对象,并用来渲染dom
tree。该目的涵盖css规则,该规则包涵采取器和表明对象。

css成分遍历的依次,是从树的低等发展遍历。

css成分遍历的相继,是从树的低级发展遍历。

(4)js解析

(4)js解析

浏览器UI线程:单线程,大诸多浏览器(比如chrome)让二个单线程共用来实施javascrip和换代用户分界面。

浏览器UI线程:单线程,大多数浏览器(比方chrome)让2个单线程共用来实施javascrip和更新用户分界面。

js阻塞页面:浏览器里的http请求被封堵一般都以由js所引起,具体原因是js文件在下载完成之后会马上实行,而js试行时候会卡住浏览器的别样表现,有壹段时间是尚未网络请求被拍卖的,那段日子之后http请求才会随之实施,这段空闲时间便是所谓的http请求被堵塞。

js阻塞页面:浏览器里的http请求被封堵一般都是由js所引起,具体原因是js文件在下载完成之后会立时实施,而js实行时候会阻塞浏览器的别样表现,有壹段时间是未曾互联网请求被拍卖的,那段日子之后http请求才会随之试行,那段空闲时间正是所谓的http请求被堵塞。

js阻塞原因:之所以会阻塞UI线程的实行,是因为js能调节UI的显得,而页面加载的规则是要挨个试行,所以在境遇js代码时候UI线程会首先推行它

js阻塞原因:之所以会阻塞UI线程的进行,是因为js能调控UI的体现,而页面加载的规则是要依次推行,所以在遇到js代码时候UI线程会首西施行它

网站地图xml地图