XML基础知识
0x00 XML基础知识
XML主要被设计用于传输和存储数据。
1 | <!--这里是声明--> |
XML文档基于树结构,从根部开始扩展到树叶。如上示例,<?xml..>是XML声明,<bookstore>是根元素,book是bookstore的子元素,title、author、year、price是book的子元素
XML主要包含:声明、元素、属性、注释、CDATA区、转义字符等
一个元素可以包含下级元素、文本、属性中的一种或多种。如上,title是元素book的子元素,而book元素有属性category,title也有文本harry potter
XML命名空间:在XML中命名冲突可以通过名称前缀来避免。
1
2
3
4
5
6
7
8
9
10
11
12<h:table>
<h:tr>
<h:td>Apples</h:td>
<h:td>Bananas</h:td>
</h:tr>
</h:table>
<f:table>
<f:name>African Coffee Table</f:name>
<f:width>80</f:width>
<f:length>120</f:length>
</f:table>
0x01 XML DTD
文档类型定义(DTD)可定义合法的XML文档构建模块,可用来验证XML的合法性。它使用一系列合法的元素来定义文档的结构。
DTD分为内部文档声明、外部文档声明和公共文档声明。
内部文档声明:DTD在XML文档内部进行声明<!DOCTYPE root-element [element-declarations]>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<!--DTD内部声明-->
<note>
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend</body>
</note>以上DTD解析:
- !DOCTYPE note (第二行)定义此文档是 note 类型的文档。
- !ELEMENT note (第三行)定义 note 元素有四个元素:”to、from、heading、body”
- *!ELEMENT to、from、heading、body (第四-七行)定义 *to、from、heading、body元素为PCDATA类型
外部文档声明:在XML文件引入一个单独的DTD文档<!DOCTYPE root-element SYSTEM “filename”>
note.dtd 1
2
3
4
5<!ELEMENT note (to,from,heading,body)>
<!ELEMENT to (#PCDATA)>
<!ELEMENT from (#PCDATA)>
<!ELEMENT heading (#PCDATA)>
<!ELEMENT body (#PCDATA)>在xml引入外部note.dtd
1
2
3
4
5
6
7
8
9<?xml version="1.0"?>
<!--外部引入DTD文档note.dtd-->
<!DOCTYPE note SYSTEM "note.dtd">
<note>
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body>
</note>公共文档声明:在XML文件中引入公共的文件,其实也属于外部文档声明。
1
2
3
4<!--格式-->
<!DOCTYPE 根元素名称 PUBLIC “DTD标识名” “公用DTD的URI”>
<!--示例-->
<!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN" "http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd">外部引用支持的协议
程序 协议 libxml2 file
http
ftpPHP file
http
ftp
php
compress.zlib
compress.bzip2
data
glob
phar
更多协议如
https、ftps、zip、ssh2.shell、ssh2.scp等协议需要扩展支持JAVA file
http
ftp
jar
netdoc
mailto
gopher *.NET file
http
https
ftp
0x02 DTD 实体
实体是用于定义引用普通文本或特殊字符的快捷方式的变量
实体根据数据类型分为字符实体、命名实体、参数实体,另外根据数据引用方式,也分为外部实体和内部实体。所以一个实体既是参数实体也是外部实体不难理解。
字符实体、命名实体统一为通用实体都是以一个&开始,以;结尾,通用实体可以用在XML、DTD等,示例:”&test;”。参数实体是以%开始、;结尾,参数实体只能在DTD文档中使用,示例:”%test;”
内部实体声明
1
2
3
4
5
6
7
8
9
10
11
12
13<!--语法-->
<!ENTITY entity-name "entity-value">
<!--示例-->
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE foo [
<!ELEMENT foo ANY >
<!ENTITY xxe "test" >]>
<creds>
<user>&xxe;</user>
<pass>mypass</pass>
</creds>外部实体声明,可引入本地资源[SYSTEM]和公共资源[PUBLIC]
1
2
3
4
5
6
7
8
9
10
11
12
13
14z<!--语法-->
<!ENTITY entity-name SYSTEM "URI/URL">
<!--示例-->
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE foo [
<!ELEMENT foo ANY >
<!ENTITY file SYSTEM "file:///etc/passwd">
<!ENTITY taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN" "http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd">
<creds>
<file>&file;</file>
<taglib>&taglib;</taglib>
</creds>
0x03 了解SOAP
SOAP(Simple Object Access Protocol,简单对象访问协议)是一种简单的基于 XML 的协议,它使应用程序通过 HTTP 来交换信息,简单来说SOAP 是用于访问网络服务的协议。
SOAP语法:
- SOAP 消息必须用 XML 来编码
- SOAP 消息必须使用 SOAP Envelope 命名空间
- SOAP 消息必须使用 SOAP Encoding 命名空间
- SOAP 消息不能包含 DTD 引用
- SOAP 消息不能包含 XML 处理指令
SOAP消息基本结构
1 |
|
SOAP故障处理soapenv或SOAP-ENV
1 | <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"> |
0x04 了解WSDL
WSDL(Web Services Description Language,网络服务描述语言)是一门基于 XML 的语言,用于描述 Web Services 以及如何对它们进行访问。
WSDL绑定
WSDL 绑定可为 web service 定义消息格式和协议细节。runoob提供了绑定soap的例子
所以其实 wsdl与soap的关系在于:wsdl绑定服务的时候可以设定使用的协议,协议可以是soap、http、smtp、ftp等任何一种传输协议,除此以外wsdl还可以绑定jms、ejb及local java等等,不过都是需要对binding和service元素做扩展的,而且需要扩展服务器的功能以支持这种扩展。
WSDL UDDI
UDDI(“Universal Description, Discovery and Integration”,通用描述、发现与集成服务) 是一种目录服务,企业可以使用它对 Web services 进行注册和搜索。
参考链接:
https://www.jianshu.com/p/8cd50bb9c7bd
https://blog.csdn.net/janchin/article/details/46849209