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())               所有节点,不包括空白字符

时间: 2024-08-29 11:01:43

BizTalk开发系列(十六) XML命名空间的相关文章

BizTalk开发系列(十八) 使用信封拆分数据库消息

之前写了一篇的<BizTalk开发系列(十七) 信封架构(Envelop)> 是关于信封架构及其拆装原理的,都是理论性的内容.信封在BizTalk开发过程中最常用的应该是在读取SQL Server 数据库的时候.一次性读取多条消息,提高了SQL Adapter对SQL Server的读取性能.今天就来做一下这个实例,增强对信封消息的理解. 数据库采用的是SQL Server 2005示例数据库:AdventureWorks 通过select * from Production.Culture选

BizTalk开发系列(十二) Schema设计之Group与Order

开发BizTalk项目的时候会先约定各系统之间往来的消息格式. 由于BizTalk内部唯一使用XML文档.因此消息的格式为XML Schema(XML Schema 用于描述 XML 文档的结构).虽然BizTalk提供了对于XML消息的验证功能.但是往往在BizTalk Schema设计器设计Schema的时候对于Group的用途不是很在意.今天我们来了解一下它的作用,希望对于设计灵活的Schema有点帮助. 首先,我们来了解一下Group的概念,在W3C的定义中. Group是用于定义在复杂

BizTalk开发系列(十九) BizTalk命名规范

目前BizTalk项目的开发人员比较少,但是在开发过程中还是需要命名规范的约束.根据以往BizTalk项目的经验,整理了BizTalk命 名规范.包括:BizTalk Application, Schema, Map, Pipeline, Orchestration Logic Port, Physical Port等.并提供了相关的示例方便大家参考. <BizTalk命名规范> 通用: 项目中能用英文单词的用单词,否则用拼音. BizTalk项目中的Schema , Map, Orchest

BizTalk开发系列(十五) Schema设计之Qualified 与Unqualified

XML Schema中的命名空间前缀限定包括对元素(Element)或属性(Attribute)的限定,即常见的如 “<ns0:root>...</ns0:root>”之类的格式.一般情况下在BizTalk Schema编辑器中设置架构的属性 elementFormDefault /AttributeFormDefault 在该 schema 的目标命名空间中声明的元素的形式.该值必须是下列字符串之一: "qualified" 或 "unqualifi

BizTalk开发系列(十) ESB Guidance安装笔记

ESB指导工具包(ESB Guidance)是一个运行于BizTalk Server 2006 R2之上的一个框架.详细信息访问ESB指导工具包社区网站 .源码下载 ESB Guidance的安装过程非常复杂牵涉到的问题也是很多方面的.我也是装了数次之后才能成功.以下是安装时的笔记,安装时主要参照ESB Guidance的帮助文档,如果遇到问题可以查此笔记. 1. 安装UDDI不能选择SSL 2. DundasChart 组件运行问题(安装ESB Management Portal需要安装此组件

Force.com微信开发系列(六)客服接口

当用户主动发消息给微信公众账号的时候(包括发送信息.点击自定义菜单click事件.订阅事件.扫描二维码事件.支付成功事件.用户维权),微信将会把消息数据推送给开发者,开发者在一段时间内(目前为48小时)可以调用客服消息接口,通过POST一个JSON数据包来发送消息给普通用户,在48小时内不限制发送次数.此接口主要用于客服等有人工消息处理环节的功能,方便开发者提供更加优质的服务. 客服接口调用请求说明 客服接口调用的接口说明如下(http请求方式为POST),如果获取Access Token的方式

C#微信公众号开发系列教程六(被动回复与上传下载多媒体文件)

原文:C#微信公众号开发系列教程六(被动回复与上传下载多媒体文件) 微信公众号开发系列教程一(调试环境部署) 微信公众号开发系列教程一(调试环境部署续:vs远程调试) C#微信公众号开发系列教程二(新手接入指南) C#微信公众号开发系列教程三(消息体签名及加解密) C#微信公众号开发系列教程四(接收普通消息) C#微信公众号开发系列教程五(接收事件推送与消息排重) C#微信公众号开发系列教程六(被动回复与上传下载多媒体文件) 第四,第五章已经讲了怎么处理用户发送的消息,本章就来讲讲怎么响应用户的

嵌入式Linux裸机开发(十六)——shell实现

嵌入式Linux裸机开发(十六)--shell实现 一.shell简介 Shell是用户与操作系统之间的接口,为用户提供了使用操作系统的接口. 1.图形界面shell 图形界面shell(Graphical User Interface shell 即 GUI shell) 应用最为广泛图形界面shell是Windows Explorer(微软的windows系列操作系统)和Linux shell,其中linux shell 包括 X window manager (BlackBox和FluxB

S3C2416裸机开发系列十五_GCC下uCOS的移植(1)

S3C2416裸机开发系列十五 GCC下uCOS的移植(1) 象棋小子    1048272975 操作系统是用来管理系统硬件.软件及数据资源,控制程序运行,并为其它应用软件提供支持的一种系统软件.根据不同的种类,又可分为实时操作系统.桌面操作系统.服务器操作系统等.对于一些小型的应用,对系统实时性要求高,硬件资源有限等的情况下,应尽量避免使用复杂庞大的操作系统(如Linux),使用小型的实时操作系统(如uCOS)更能满足应用的需求.笔者此处就uCOS-II的移植作一个简单的介绍. 1. 代码准