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. HTML5 重要标签及其属性学习

    1.google字体:<link href="https://fonts.googleapis.com/css?family=Lobster" rel="style ...

  2. POJ 1200 字符串HASH

    题目链接:http://poj.org/problem?id=1200 题意:给定一个字符串,字符串只有NC个不同的字符,问这个字符串所有长度为N的子串有多少个不相同. 思路:字符串HASH,因为只有 ...

  3. react-router

    基本的构建 import ReactRouter from 'react-router'; let {Route, Router, Link, IndexRoute} = ReactRouter.Ro ...

  4. ural 2068. Game of Nuts

    2068. Game of Nuts Time limit: 1.0 secondMemory limit: 64 MB The war for Westeros is still in proces ...

  5. BZOJ1931 : [Shoi2007]Permutation 有序的计数

    枚举LCP以及下一位变小成什么,统计出剩下的有几个可以在原位置. 然后枚举剩下的至少有几个在原位置,容斥计算答案. 时间复杂度$O(n^3)$. #include<cstdio> type ...

  6. BZOJ4118 : [Wf2015]Window Manager

    OPEN.CLOSE.RESIZE操作直接模拟即可. 对于MOVE,设$f_i$表示$i$号矩形的坐标,先无视边界通过DP求出每个矩形的坐标,再根据边界反向用第二次DP求出被移动矩形移动的真实距离,再 ...

  7. (转)linux命令行下的ftp 多文件下载和目录下载

    link:http://yahoon.blog.51cto.com/13184/200991 目标ftp服务器是一个非标准端口的ftp   1.通过shell登录 #ftp    //shell下输入 ...

  8. Hadoop学习笔记(1)

    Doug Cutting Lucene(索引引擎)---Nutch(搜索Data抓取)---Hadoop 1997:Lucene 2003:GFS 2004:NDFS\MapReduce\Nutch ...

  9. 翻译:让网络更快一些——最小化浏览器中的回流(reflow)

    关于reflowreflow(英音:[ri:’fləu] 美音:[ri’flo])在词典中的解释是回流,逆流.而在web应用中,翻译为回流有些牵强.我个人觉得,理解为回炉(重新塑形),似乎更加形象一点 ...

  10. BZOJ 3223 & 区间翻转

    题意: 就是贴个代码,这是我入门题的弱化版..然而一共还是写了40分钟,不专注(一边看比赛一边打)是一个问题,splay每个操作的细节确实有点多(什么时候updata啊..什么时候pushdown啊. ...