BizTalk开发系列(十六) XML命名空间
BizTalk开发过程中如果有对XML进行开发操作,比如在自定义代码里操作XML消息或者在Mapping的时候使用Xpath对XML进行操 作。则有机会遇到XML命名空间的问题。常见的是使用Xpath选取节点的时候不知道要不要加上命名空间前缀,或者是什么时候该加什么时候不该加。为此, 做一个Sample来校验一下XML命名空间在XML操作过程中的影响。
名称空间是W3C推荐标准提供的一种统一命名XML文档中的元素和属性的机制。使用名称空间可以明确标识和组合XML文档中来自不同标记词汇表的元素和属 性,避免了名称之间的冲突。XML 命名空间属性被放置于某个元素的开始标签之中,并使用以下的语法:
xmlns:namespace-prefix="namespaceURI"
当一个命名空间被定义在某个元素的开始标签中时,所有带有相同前缀的子元素都会与同一个命名空间相关联。
Sample说明
新建一个测试XML。内容如[Code1]设置不同的命名空间使用场景。另外新建一个XSLT(XML转换语言)文件,内容如[Code2]。在Visual Studio中使用XSLT测试中的断点在监视窗口通过Xpath查询。校验在什么情况下哪些节点需要命名空间。
[Code1]
<?xml version="1.0" encoding="utf-8"?> <Root xmlns:ns0="http://quicklearn.cn" xmlns:ns1="http://addressbook.quicklearn.cn" xmlns:ns2="http://person.quicklearn.cn"> <ns1:addressbook id="1" > <ns2:person> <name>cbcye</name> <mobile>12345</mobile> </ns2:person> </ns1:addressbook> </Root>
[Code2]
<?xml version="1.0" encoding="utf-16"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0" xmlns:qn="http://quicklearn.cn"/ xmlns:adr="http://addressbook.quicklearn.cn"/ xmlns:per="http://person.quicklearn.cn"/ > <xsl:template match="/"> <xsl:apply-templates select="/"/> </xsl:template> </xsl:stylesheet>
[测试贴图]
![]()
缺省命名空间
缺省命名空间适用于声明它的元素(如果那个元素没有命名空间前缀)和所有该元素内容中所有没有前缀的元素。假如在缺省命名空间声明里的 URI 引用为空,那么在声明范围内没有前缀的元素不被认为存在任何命名空间里。注意缺省命名空间不直接适用于属性。
Test1 无命名空间
<?xml version="1.0" encoding="utf-8"?> <Root> <addressbook id="1"> … </addressbook> </Root>
元素:addressbook Xpath表达式: /Root/addressbook
属性:id Xpath表达式: /Root/addressbook /@id
Test2 有命名空间
<?xml version="1.0" encoding="utf-8"?> <Root xmlns=http://quicklearn.cn/> <addressbook id="1"> … </addressbook> </Root>
元素:addressbook Xpath表达式: /qn:Root/qn:addressbook (qn为在XSLT文件中声明的前缀)
属性:id Xpath表达式: /qn:Root/qn:addressbook/@id (qn为在XSLT文件中声明的前缀)
命名空间前缀
命名空间前缀提供合法名字的命名空间前缀部分,并且必须与在命名空间声明中的一个命名空间 URI 引用相关联。注意前缀只起命名空间占位符的作用。应用程序应使用命名空间名,而不是前缀,来构成有效范围在所含文档之外的名字。
Test1 前缀+根节点
<?xml version="1.0" encoding="utf-8"?> <ns0:Root xmlns:ns0=http://quicklearn.cn/> <addressbook id="1"> … </addressbook> </ns0:Root>
元素:addressbook Xpath表达式: /qn:Root/addressbook (qn为在XSLT文件中声明的前缀)
属性:id Xpath表达式: /qn:Root/addressbook /@id (qn为在XSLT文件中声明的前缀)
Test2 前缀+ 子元素
<?xml version="1.0" encoding="utf-8"?> <Root xmlns:ns0=http://quicklearn.cn/> <ns0:addressbook id="1"> … </ns0:addressbook> </Root>
元素:addressbook Xpath表达式: /Root/qn:addressbook (qn为在XSLT文件中声明的前缀)
属性:id Xpath表达式: /Root/qn:addressbook /@id (qn为在XSLT文件中声明的前缀)
多个命名空间
在一个XML文档中存在多个命名空间,命名空间通过缺省或都前缀约束元素或属性存在于中个命名空间。
Test1
<?xml version="1.0" encoding="utf-8"?> <Root xmlns=http://quicklearn.cn/> <addressbook id="1" xmlns=http://addressbook.quicklearn.cn/> … </addressbook> </ns0:Root>
元素:addressbook Xpath表达式: /qn:Root/adr:addressbook (qn,adr为在XSLT文件中声明的前缀)
属性:id Xpath表达式: /qn:Root/adr:addressbook /@id(qn,adr为在XSLT文件中声明的前缀)
Test2
<?xml version="1.0" encoding="utf-8"?> <Root xmlns:ns0="http://quicklearn.cn"/ xmlns:ns1="http://addressbook.quicklearn.cn"/ xmlns:ns2="http://person.quicklearn.cn"/> <ns1:addressbook id="1" > <ns2:person> <name>cbcye</name> <mobile>12345</mobile> </ns2:person> </ns1:addressbook> </Root>
元素:name Xpath表达式: /Root/adr:addressbook/per:person/name
(qn,adr,per为在XSLT文件中声明的前缀)
属性:id Xpath表达式: /Root/adr:addressbook/@id(qn,adr为在XSLT文件中声明的前缀)
总结
XML命名空间使用规则大概可以归纳如下:缺省命名空间约束全局,带前缀命名空间约束局部,局部声明优先全局。另外如果你能坚持看到这里的话顺便回答一下这个问题:以下XML文档中Test节点有无命名空间?如果有的话命名空间是什么?
<ns0:Root xmlns:ns0="http://quicklearn.cn"><Test></Test></ns0:Root>
[Update: 2008.10.21 11:40]
如果您有安装XML Spy的话。则可以直接使用XML Spy的Xpath求值功能(在菜单栏中点击XML选择求Xpath值)。直接使用Xpath表达式求得各节点或属性的Namespace。
![]()
Xpth表达式
//concat(local-name()," >>> ",namespace-uri()) 所有节点,包括空白字符
//@*/concat(local-name()," >>> ",namespace-uri()) 所有属性节点
//*/concat(local-name()," >>> ",namespace-uri()) 所有节点,不包括空白字符
BizTalk开发系列(十六) XML命名空间的更多相关文章
- BizTalk开发系列(十四) XML空白字符(WhiteSpace)
最近在做一个BizTalk项目,对XML文件的处理很复杂.本来是想找有没有方法可以一次性去除XML文件中节点和属性的值的空格.但是找了很久没有看到相关的方法.如果有知道该方法的麻烦跟我讲一下:cbcy ...
- S3C2416裸机开发系列十六_sd卡驱动实现
S3C2416裸机开发系列十六 sd卡驱动实现 象棋小子 1048272975 SD卡(Secure Digital Memory Card)具有体积小.容量大.传输数据快.可插拔.安全性好等长 ...
- BizTalk开发系列(十八) 使用信封拆分数据库消息
之前写了一篇的<BizTalk开发系列(十七) 信封架构(Envelop)> 是关于信封架构及其拆装原理的,都是理论性的内容.信封在BizTalk开发过程中最常用的应该是在读取SQL Se ...
- BizTalk开发系列(十九) BizTalk命名规范
目前BizTalk项目的开发人员比较少,但是在开发过程中还是需要命名规范的约束.根据以往BizTalk项目的经验,整理了BizTalk命 名规范.包括:BizTalk Application, Sch ...
- BizTalk开发系列(十五) Schema设计之Qualified 与Unqualified
XML Schema中的命名空间前缀限定包括对元素(Element)或属性(Attribute)的限定,即常见的如 “<ns0:root>...</ns0:root>”之类的格 ...
- BizTalk开发系列(十二) Schema设计之Group与Order
开发BizTalk项目的时候会先约定各系统之间往来的消息格式. 由于BizTalk内部唯一使用XML文档.因此消息的格式为XML Schema(XML Schema 用于描述 XML 文档的结构).虽 ...
- BizTalk开发系列(十) ESB Guidance安装笔记
ESB指导工具包(ESB Guidance)是一个运行于BizTalk Server 2006 R2之上的一个框架.详细信息访问ESB指导工具包社区网站 .源码下载 ESB Guidance的安装过程 ...
- arcgis api for js入门开发系列十六迁徙流动图
最近公司有个arcgis api for js的项目,需要用到百度echarts迁徙图效果,而百度那个效果实现是结合百度地图的,怎么才能跟arcgis api结合呢,网上搜索,终于在github找到了 ...
- arcgis api 3.x for js 入门开发系列十六迁徙流动图
前言 关于本篇功能实现用到的 api 涉及类看不懂的,请参照 esri 官网的 arcgis api 3.x for js:esri 官网 api,里面详细的介绍 arcgis api 3.x 各个类 ...
随机推荐
- JavaScript入门(2)
encodeURI()和 decodeURI()作用 编码与解码 encodeURIComponent()和 decodeURIComponent()作用区别是 后者可以处理一些特殊字符进行转义 ...
- Android性能优化之布局优化
最新最准确内容建议直接访问原文:Android性能优化之布局优化 本文为Android性能优化的第二篇——布局优化,主要介绍使用抽象布局标签(include, viewstub, merge).去除不 ...
- hdu2255 二分图最大权配KM
KM算法:hdu2255 (大概理解了 参考博客: http://blog.csdn.net/niushuai666/article/details/7171880) 所谓交错树:就是 ...
- 在 Chrome 中调试 Android 浏览器
最近需要使用 Chrome Developer Tools 调试 Android 浏览器,但是官方指南并不是很好使,经过一番折腾,终于调试成功了,在此把经验分享给需要的朋友. Chrome Devel ...
- 利用TaskCompletionSource将EAP转换成TAP
1.原始的异步方法的调用 我们来看个简单的例子,在这里演示调用 WebClient.DownloadStringAsync 方法(这个方法不是 TAP),然后由 WebClient.Dow ...
- 修改WordPress中上传附件2M大小限制的方法/php+iis上传附件默认大小修改方法
在服务器上架设好WordPress后,使用过程中发现,上传附件大小有2M的限制 话说服务器就是本机,可以直接把文件拖到附件存储文件夹下,然后在需要附件的地方引用链接 可是这种落后的方法终究不是办法,还 ...
- Js提示框
百度搜索 1.artDialog 2.ymPrompt 以下网站提供资料参考 http://www.17sucai.com/ http://www.juheweb.com/ http://www.5i ...
- OpenCV 第一课(安装与配置)
OpenCV 第一课(安装与配置) win10,opencv-2.4.13, 安装, vs2013, 配置 下载安装软件 官网OpenCV下载地址下载最新版本,我下载的是opencv.2.4.13,然 ...
- ACM: 强化训练-百度之星-Problem C-字典树
Problem C Time Limit:1000MS Memory Limit:131072KB 64bit IO Format:%I64d & %I64u Descript ...
- [WP8.1UI控件编程]SemanticZoom控件实现分组列表
11.1.5 SemanticZoom实现分组列表 SemanticZoom控件可以让用户实现一种更加高级的列表,这种列表可以对列表的项目进行分组,同时这个SemanticZoom控件会提供两个具有相 ...