关于XML Schema命名空间中已经有xmlns却还要targetnamespace的理解
来源:互联网 发布:艳子钩把淘宝店 编辑:程序博客网 时间:2024/05/20 15:38
最近在学习XML Schema,没法很好的分清命名空间的xmlns、targetnamespace的区别,为什么在已经有全局命名空间xmlns和定义的命名空间xmlns:prefix后还要加入一个targetnamespace。上StackoverFlow找到一些解释,现在拿出来分享一下。
为什么要用targetnamespace?
通常一个很小的xml文档不需要复杂的命名空间来限定作用域。但是当文档复杂性越来越大,全的命名空间规则很复杂,如果要通过XML Schema来创建和修改XML的内容限定的话,很多人会习惯性的在一个文件中储存所有的Schema。但是实际上一个良好的符合标准的规范应当是将文档分成很多个子Schema,这个过程可以叫做XML Schema Binding。命名空间就是一个分割Schema的机制,子schema被包含在一个父schema中,这样就提高了复用性,使得一个schema包可以用在很多的工程中。而且这样能够提高定义的可读性,也使文档易于管理。
xmlns:prefix="http:/www.w3c.com" 这种形式是自定义prefix的方式来命名作用空间,属于最小的作用域。
xmlns="http:/www.w3c.com" 这种形式是定义默认命名空间,文档内所有的未做限定的元素都在这个命名空间下。
targetnamespace就是收罗不同文件的统一的一个域名。
形象地比喻来说就像一个Java工程里,class文件中通常会标明文件归属的包import packagetargetnamespace类比于包的名字。
例:
常见的XML及其XML Schema样式
XML:
<p:Person xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://localhost:8080/scribble/xml/Person" xmlns:v="http://localhost:8080/scribble/xml/Vehicle" xsi:schemaLocation=" http://localhost:8080/scribble/xml/Person http://localhost:8080/scribble/xml/person.xsd"> <name>John</name> <age>28</age> <height>59</height> <v:Vehicle> <color>Red</color> <wheels>4</wheels> <seats>2</seats> </v:Vehicle></p:Person>
该XML没有默认命名空间,但是有xmlns:p和xmlns:v标识URI
Schema:
Person:
<?xml version="1.0" encoding="UTF-8"?><schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="http://localhost:8080/scribble/xml/Person" elementFormDefault="qualified" xmlns:v="http://localhost:8080/scribble/xml/Vehicle"> <import namespace="http://localhost:8080/scribble/xml/Vehicle" schemaLocation="http://localhost:8080/scribble/xml/v.xsd"/> <element name="Person"> <complexType> <sequence> <element name="name" form="unqualified" type="NCName"/> <element name="age" form="unqualified" type="integer"/> <element name="height" form="unqualified" type="integer"/> <element ref="v:Vehicle"/> </sequence> </complexType> </element></schema>
Vehicle:
<?xml version="1.0" encoding="UTF-8"?><schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="http://localhost:8080/scribble/xml/Vehicle" elementFormDefault="qualified"> <element name="Vehicle"> <complexType> <sequence> <element name="color" form="unqualified" type="NCName"/> <element name="wheels" form="unqualified" type="integer"/> <element name="seats" form="unqualified" type="integer"/> </sequence> </complexType> </element></schema>
XML文件受Person限制,Person文件含有Vehicle限制。两个Schema文件的默认命名空间都是:而targetNamespace被用作了实例XML的别名p和v。这里targetNamespace作为实例文件的命名空间,与xml实例文件中的schema文件等声明的命名空间关系不大。targetNamespace就好像一个会议的名单,文件中的命名空间就像是一个人的姓名牌,只要姓名牌和名单对上了就能用。在这里v的命名空间级别最高,p的就要服从于v。http://www.w3.org/2001/XMLSchema
有了这样的命名空间的规则,这样schema的复用性就能很好地体现。
- 关于XML Schema命名空间中已经有xmlns却还要targetnamespace的理解
- XML Schema命名空间:xmlns介绍
- XML Schema中targetNamespace概念
- XML Schema中targetNamespace概念
- 使用XPath查询带有命名空间(有xmlns)的XML
- C#中读取带有Xmlns命名空间的XML文件
- xmlns:XML命名空间
- XML之命名空间的作用(xmlns)
- XML之命名空间的作用(xmlns)
- XML之命名空间的作用(xmlns)
- XML之命名空间的作用(xmlns)
- XML之命名空间的作用(xmlns)
- xmlns(xml命名空间)
- .NET(C#):使用XPath查询带有命名空间(有xmlns)的XML
- 我对 xmlschema 的 targetNamespace 、xmlns、include、import的理解
- XML Schema命名空间
- Xmlns与targetNamespace 的区别
- Xmlns与targetNamespace 的区别
- 【Zanuck 镇】lnmp单机环境最佳性能优化
- Android通知Notification全面剖析
- GitHub学习笔记 --- .gitignore配置说明
- 程序员,你为什么值这么多钱?
- iOS开发微信支付图文教程
- 关于XML Schema命名空间中已经有xmlns却还要targetnamespace的理解
- 使用socket(AsyncSocket、GCDAsyncSocket)进行文件的断点上传操作
- ESXi主机证书替换
- 安卓发送邮件————(非启动第三方app)
- c++ this指针的用法
- Centos7 ZABBIX3.0安装
- 【第十四周项目2 - 二叉树排序树中查找的路径】
- 尝试新思路——CError和CExit
- 前端总结:踩过的坑以及一些冷知识