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命名空间的更多相关文章

  1. BizTalk开发系列(十四) XML空白字符(WhiteSpace)

    最近在做一个BizTalk项目,对XML文件的处理很复杂.本来是想找有没有方法可以一次性去除XML文件中节点和属性的值的空格.但是找了很久没有看到相关的方法.如果有知道该方法的麻烦跟我讲一下:cbcy ...

  2. S3C2416裸机开发系列十六_sd卡驱动实现

    S3C2416裸机开发系列十六 sd卡驱动实现 象棋小子    1048272975 SD卡(Secure Digital Memory Card)具有体积小.容量大.传输数据快.可插拔.安全性好等长 ...

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

    之前写了一篇的<BizTalk开发系列(十七) 信封架构(Envelop)> 是关于信封架构及其拆装原理的,都是理论性的内容.信封在BizTalk开发过程中最常用的应该是在读取SQL Se ...

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

    目前BizTalk项目的开发人员比较少,但是在开发过程中还是需要命名规范的约束.根据以往BizTalk项目的经验,整理了BizTalk命 名规范.包括:BizTalk Application, Sch ...

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

    XML Schema中的命名空间前缀限定包括对元素(Element)或属性(Attribute)的限定,即常见的如 “<ns0:root>...</ns0:root>”之类的格 ...

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

    开发BizTalk项目的时候会先约定各系统之间往来的消息格式. 由于BizTalk内部唯一使用XML文档.因此消息的格式为XML Schema(XML Schema 用于描述 XML 文档的结构).虽 ...

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

    ESB指导工具包(ESB Guidance)是一个运行于BizTalk Server 2006 R2之上的一个框架.详细信息访问ESB指导工具包社区网站 .源码下载 ESB Guidance的安装过程 ...

  8. arcgis api for js入门开发系列十六迁徙流动图

    最近公司有个arcgis api for js的项目,需要用到百度echarts迁徙图效果,而百度那个效果实现是结合百度地图的,怎么才能跟arcgis api结合呢,网上搜索,终于在github找到了 ...

  9. arcgis api 3.x for js 入门开发系列十六迁徙流动图

    前言 关于本篇功能实现用到的 api 涉及类看不懂的,请参照 esri 官网的 arcgis api 3.x for js:esri 官网 api,里面详细的介绍 arcgis api 3.x 各个类 ...

随机推荐

  1. poj3642 01背包

    http://poj.org/problem?id=3624 #include<iostream> #include<cstdio> #include<algorithm ...

  2. 在IOS手机safari浏览器的无痕模式下,localStorage不起作用

    无痕模式是黑色风格,正常模式是白色风格.在无痕模式中,使用localStorage.setItem()会报错,但在window对象下确实有localStorage.setItem方法. if (typ ...

  3. String equals()方法使用以及子串加密

    String equals()方法的实现方法: 名称 说明 String.Equals (Object) 确定此 String 实例是否与指定的对象(也必须是 String)具有相同的值. Strin ...

  4. 转 Delphi中使用FastMM4结合View CPU避免内存泄漏

    http://www.cnblogs.com/kongchao/archive/2009/10/27/1590479.html 核心提示:内存泄漏经常出现在本地代码中,特别是多线程和发生异常的情况下, ...

  5. Myeclipse中创建Maven工程的时候没有 webapp-javaee6

    1. http://mvnrepository.com/artifact/org.codehaus.mojo.archetypes/webapp-javaee6/1.5 中有描述

  6. HIT2543 Stone IV(一定费用内的最大流)

    题目大概说,有n个从0到n-1的城市,要从城市0运送石头到城市1,运送石头的单价是p.城市间的有m条双向路相连,路都有能运送石头的限额c1,如果超过限额运送石头的单价就要提高c2.问在总花费c以内能运 ...

  7. java基础-表达式,语句和代码块

    浏览以下内容前,请点击并阅读 声明 表达式 表达式由变量,操作符和方法调用组成,表达式的返回值类型由表达式中的元素(如操作符,变量等)决定如: cadence = 0 上述代码将返回一个int类型的值 ...

  8. UpdatePanel的使用

    一.UpdatePanel的结构 <asp:ScriptManager ID="ScriptManager1" runat="server" > & ...

  9. jquerymobile页面跳转和参数传递

    http://blog.csdn.net/chen052210123/article/details/7481578 页面跳转: 页面跳转时pagebeforechange事件会被触发两次,通过$(d ...

  10. phpstorm 10 修改背景图片和字体

    修改menu:File ~ Settings ~ Appearance & Behavior ~ Appearance ~ Theme 改成 Darcula即成黑色背景 menu字体大小: 编 ...