从xmlns的作用说起
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
从xmlns的作用说起
查了资料和自己实践后,得出了一些关于xml和xmlns的结论
看一个最常见的javaweb 中xml配置文件的开头:
<?xml version='1.0' encoding='UTF-8'?> <beans xmlns='' xmlns:xsi='' xmlns:context='' xmlns:mvc='' xsi:schemaLocation=' /spring-beans.xsd /spring-mvc-4.0.xsd /spring-context.xsd'> 其中xmlns的意思就是xml namespace ,就是命名空间,为了区分一个xml中重复的定义而产生的,为什么后面跟着一串url, 为了唯一性
如何使用xmlns:
很简单,使用语法: xmlns:namespace-prefix='namespaceURI',如:
xmlns:abc=''.
定义了abc后,要引用''中的元素,就必须加上abc前缀,如常见的:
<context:component-scan base-package='com.taotao.controller' />
看这一句:
<beans xmlns=''
定义默认命名空间为
为一个xml文档定义默认的命名空间
为什么beans前没有加上命名空间限定符,因为用xmlns定义了默认的命名空间后,在该xml下使用这个命名空间下的元素可以不用加前缀
第三行到第五行:
定义了三个命名空间,代号为xsi,context,mvc
再看看后面的:
xsi:schemaLocation=' /spring-beans.xsd /spring-mvc-4.0.xsd /spring-context.xsd'
由于第三行定义了xsi,所以可以使用xsi中的元素schemaLocation
xsi是个什么?
按照前面说的xmlns:xsi,就是定义了命名空间代号xsi,代表
但是我们发现,这个 xmlns:xsi 在不同的 xml 文档中似乎都会出现。
这是因为,xsi 已经成为了一个业界默认的用于XSD((XML Schema Definition) 文件的命名空间。
而XSD 文件(也常常称为Schema 文件)是用来定义 xml 文档结构的
Schema :概要,计划,图表,XML
Schema Definition可以理解为xml文件的规
范和约束
注解:XML 解析器可以根据一个XSD
文件的内容来解析另一个 XML 文件,判断该
文件的结构是否和XSD 文件中定义的一致。
XSD 文件可以理解为 XML 文档可以自定义的
语法或格式检查器。
那么,有了上述的理解,再来看xsi:schemaLocation 这几句:上面三句的语法其实是, xsi:schemaLocation = '键' “值” '键' “值” '键' “值”,分别对应上面的三个代号,一共是三对即xsi 命名空间下schemaLocation 元素的值为一个由空格分开的键值对
前一个“键” 指代【命名空间URL】
后一个值指代【XSD location URI】 , 这个值指示了前一个命名空间所对应的 XSD 文件的位置, xml解析器可以根据这个获取到 XSD 文件,从而通过XSD 文件对所有属于命名空间“的元素结构进行校验,因此这个值必然是可以访问的,且访问到的内容是一个XSD 文件的内容
XSD本身也是一个xml文件,遵循XML
格式
问题:
1.在项目生成时,会去网络上请求访问这些xsd文件吗?
应该是本地有一份备份,包含了新老版本的xsd文件,javaweb 项目应该会先访问本地的,本地找不到再访问网络上的
1.1.那会去网络上请求访问xmlns的对应的url吗?
不知道
2.在设置了命名空间后能不能写别的节点元素,比如<aaa></aaa>
设置了命名空间后,无法再自定义元素了,要是命名空间中的元素才能被定义,而且必须要遵循xsd语法规则
3.把这些命名空间全删了又能怎么样
编译能过,因为不写命名空间的话,没约束,可以自定义元素,但是一旦有请求进来就会报错:
org.springframework.beans.factory.xml.XmlBeanDefinitionSt oreException: Line 2 in XML document from class path resource [spring/springmvc.xml] is invalid; nested exception is org.xml.sax.SAXParseException; lineNumber: 2; columnNumber: 8; cvc-elt.1: 找不到元素 'beans' 的声明。
4.xsd里面写了些什么?
可以拷贝url到浏览器访问一下,是一份xml文件,里面有定义一些元素和元素的语法
5.只定义xmlns ,删除后面的xsi:schemaLocation行不行
不行,经测试,会报错,提示beans元素找不到,也就是说xml 中的元素是被定义在了xsd中而不是前面的url中,既定义在“值”中,而不是“键”中
如果加上xsi:schemaLocation,则在xml中编辑,敲一个<符号,
会有一堆下拉的智能提示,而删除xsi:schemaLocation仅剩xmlns则没有智能提示
而且如本例中的context, 键URL,访问下是个列表
而值URL /spring-context-4.0.xsd 才是真正的XSD文件所在
只有加上了这个,才能有xml中的元素,例如bean,context:annotation-config等元素,如下图:
也就是说定义xmlns:A ='url01' 然后xsi:schemaLocation = 'url01 real_url/4.0_xsd'
真正的元素都在xsd中
那么是不是url01也是个代号,可以随意改呢?
答案是不行,若本xml中没有使用url01中的元素,那么无所谓,可以。
但是一旦使用了,就会报错
所以除了A是一个可以任意替换的字符串代号外,url01和real_url/4.0_xsd都是不能乱改的
6.只定义xsi:schemaLocation,删掉xmlns中某行,比如本例中xsi:schemaLocation不动,删除xmlns:context这一行,行不行?
不行,报错
WPF中的xaml
xaml是xml的一种,是子集,xaml也遵循xml语法|
<Window x:Class='TestClient.TradeWindow'
xmlns='/winfx/2006/xaml/pre sentation'
xmlns:x='/winfx/2006/xaml' xmlns:d='/expression/blend/2 008'
xmlns:mc='/markup-compatibility/2006'
Title='' Height='450' Width='800'>
<Grid>
</Grid>
</Window>
x:Class='TestClient.TradeWindow' 这句的意思为本xml中对应的类为'TestClient.TradeWindow'
xml文件只要遵循xml语法即可,可以任
意定义元素,但是xml解析器不同,所以解析
的规则也不一样,VS的解析方式和Eclipse的
不一致,所以应该区别对待,但是在xmlns上,
基本上是一致的
xmlns='/winfx/2006/xaml/pre sentation'
定义默认命名空间,这个url能访问,但是内容是无效的,但是vs 的解析器应该是把这个url映射到了WPF的presentation程序集下因此,在这个xml中,可以定义多个如Grid,Dockpanel的元素总结:
1.xml根据不同IDE有不同的写法,但是必须遵循基本的xml语法,如只能有一个根节点,节点必须关闭
2.xmlns就是Java,C#中的namespace,引入了namespace就可以使用其中的元素。