当前位置: 首页 > news >正文

Webservice-DTD和Schema(四)

SOAP之前,写点XML的东西,为Soap打下一个比较好的基础。XML中主要讲DTDSchema以及对XML的解析与XMLJava对象的关系等,DTDSchema都不陌生,就蜻蜓点水,一带而过,XMl的解析在下篇中写。

关于dtd作用好处不用在此多言,它大有被schema替代的趋势,下面举例说明。首先来认识一下的DTD,如果我们想要如下格式的xml文档,dtd应该怎么写呢?

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE persons SYSTEM "persons.dtd">
<persons>
	<person id="_1">
		<sex/>
		<name/>
		<age/>
		<messages>
			<message>
				<title/>
				<content/>
			</message>
		</messages>
	</person>
	<person id="_2">
		<sex></sex>
		<name></name>
		<age></age>
		<messages>
			<message>
				<title></title>
				<content></content>
			</message>
		</messages>
	</person>
</persons>

来看为上面xml所写的dtd

<?xml version="1.0" encoding="UTF-8"?>
<!ELEMENT persons (person+)>
<!ELEMENT person (sex,name,age,messages+)>
<!ATTLIST person id ID #REQUIRED>
<!ELEMENT sex (#PCDATA)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT age (#PCDATA)>
<!ELEMENT messages (message+)>
<!ELEMENT message (title,content)>
<!ELEMENT title (#PCDATA)>
<!ELEMENT content (#PCDATA)>

阅读上面的dtdpersons为根节点,里面包含person节点,+为常用控制符,?表示0次或者1次,+表示1此或者多次,默认表示1次,这个不需要记忆,查文档即可,person包括sex等节点,为每一个节点定义类型,<!ATTLIST>是给person定义属性的,ID为类型,#REQUIRED表示该属性必须,不能不写。

dtd没多少内容,会写会用基本就可以了。关于schema有三部分内容,第一是命名空间,第二是元素和属性的定义,第三是语法和建议编写的方式。Schema基于xml语法,编写更加的合理,使用命名空间支持名称相同的元素,完成了对java或者所有对象的修饰并且提供了大量的数据类型。

命名空间

先来讲解命名空间,所谓命名空间就等于包,跟java中的包是一个作用,下图为定义一个schema


xml中引入schema,需要用schemaLocation属性来指定,此属性有两个值,第一个值是需要使用的命名空间,第二个值是供命名空间使用的xmlschema的位置,两者之间用空格分隔,下图中没有体现,读者可参考spring中的配置,还需要注意的是,使用schemaLocation属性时,需要指定该属性来自哪里。


通过文件路径引入:


元素和属性的定义

元素是有element来定义,复杂类型由complexType表示,见下图:


属性的定义包含在complexType内部:


语法和建议的编写方式

Schema有三大种编写方式的方式,RussianDollSalamiSlice和Venetian Blind。

RussianDoll:只有一个根元素,通过嵌套的方式完成编写,结构清晰,但不能重用。编写示例就是文章前面元素和属性定义中讲到的那种方式。

SalamiSlice:和上边的玩偶相反,什么节点都不包含,能够最大化重用,根元素不清晰。


VenetianBlind:集成了以上两种方式的优点。只有一个根结点,一般重用不是对元素的重用,更多是对类型的重用,因此,对于schema不仅有complexType还有simpleType


一般是一个schema对应一个java类,将两个schema组合可以使用include标签,将schema转换成一个java对象可以使用xjc命令,用法可百度之。

相关文章:

  • 个人学习QT问题收集整理稿
  • (4)事件处理——(2)在页面加载的时候执行任务(Performing tasks on page load)...
  • SICP 习题 (1.13) 解题总结
  • 小智慧60
  • java中正则表达式中的非字符串处理
  • 小智慧61
  • IOS 开发之 CocoaPods讲解
  • eclipse安装插件checkstyle
  • 制作网站以及发布的流程
  • checkstyle之如何配置
  • c#中datetime类型与SqlServer中datetime格式的区别
  • 在git的Bash下进行复制粘贴
  • 小智慧62
  • SICP 习题 (1.14)解题总结
  • 一个爬电商数据并实现搜索的例子
  • $translatePartialLoader加载失败及解决方式
  • “寒冬”下的金三银四跳槽季来了,帮你客观分析一下局面
  • 《深入 React 技术栈》
  • 0基础学习移动端适配
  • Angular js 常用指令ng-if、ng-class、ng-option、ng-value、ng-click是如何使用的?
  • egg(89)--egg之redis的发布和订阅
  • ESLint简单操作
  • JDK 6和JDK 7中的substring()方法
  • Stream流与Lambda表达式(三) 静态工厂类Collectors
  • Windows Containers 大冒险: 容器网络
  • 大整数乘法-表格法
  • 观察者模式实现非直接耦合
  • 机器学习 vs. 深度学习
  • 技术:超级实用的电脑小技巧
  • 试着探索高并发下的系统架构面貌
  • 手机端车牌号码键盘的vue组件
  • 为物联网而生:高性能时间序列数据库HiTSDB商业化首发!
  • 我的业余项目总结
  • 我感觉这是史上最牛的防sql注入方法类
  • 译米田引理
  • 由插件封装引出的一丢丢思考
  • d²y/dx²; 偏导数问题 请问f1 f2是什么意思
  • ​ 全球云科技基础设施:亚马逊云科技的海外服务器网络如何演进
  • ​flutter 代码混淆
  • #stm32整理(一)flash读写
  • $ git push -u origin master 推送到远程库出错
  • (3)(3.5) 遥测无线电区域条例
  • (C语言)输入自定义个数的整数,打印出最大值和最小值
  • (java)关于Thread的挂起和恢复
  • (附源码)springboot高校宿舍交电费系统 毕业设计031552
  • (蓝桥杯每日一题)平方末尾及补充(常用的字符串函数功能)
  • (论文阅读40-45)图像描述1
  • (三)Honghu Cloud云架构一定时调度平台
  • (四)七种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划MATLAB
  • (一)RocketMQ初步认识
  • (转)LINQ之路
  • (转)Oracle存储过程编写经验和优化措施
  • .NET CORE 第一节 创建基本的 asp.net core
  • .NET Standard / dotnet-core / net472 —— .NET 究竟应该如何大小写?
  • .NET 发展历程