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. 利用scp传输文件小结

    从本地复制到远程 scp mysql-5.5.29-linux2.6-x86_64.tar.gz 192.168.1.11:/opt 指定端口: scp -P 60022 /opt/ray/nginx ...

  2. windows下配置python库

    安装easy_install: 下载ez_setup.py文件,命令行执行python ez_setup.py; 将python文件夹下的Scripts文件夹加入到系统path路径: 检查easy_i ...

  3. light oj 1422 Halloween Costumes (区间dp)

    题目链接:http://vjudge.net/contest/141291#problem/D 题意:有n个地方,每个地方要穿一种衣服,衣服可以嵌套穿,一旦脱下的衣服不能再穿,除非穿同样的一件新的,问 ...

  4. [工作中的设计模式]建造者模式builder

    一.模式解析 建造模式是将复杂的内部创建封装在内部,对于外部调用的人来说,只需要传入建造者和建造工具,对于内部是如何建造成成品的,调用者无需关心. 以上是对建造者模式的官方定义,简单说就是对于复杂对象 ...

  5. DIjkstra(反向边) POJ 3268 Silver Cow Party || POJ 1511 Invitation Cards

    题目传送门 1 2 题意:有向图,所有点先走到x点,在从x点返回,问其中最大的某点最短路程 分析:对图正反都跑一次最短路,开两个数组记录x到其余点的距离,这样就能求出来的最短路以及回去的最短路. PO ...

  6. 疯狂java学习笔记之面向对象(一) - 定义类、方法、构造器

    Java面向对象 1.定义类 2.创建对象.调用方法 类和对象: 某一类对象的概念定义. 比如:人类 - 抽象出来的概念(不特指某个人) 对象 - 在类的概念下产生的一个实例,它就是一个对象了. ja ...

  7. linux查看和修改当前系统时间

    一.查看和修改Linux的时区 1. 查看当前时区 命令 : "date -R" 2. 修改设置Linux服务器时区 方法 A 命令 : "tzselect" ...

  8. Django的cookie和session

    http://www.cnblogs.com/lhj588/archive/2011/10/27/2226976.html

  9. linux ubuntu的root密码

    安装完Ubuntu后忽然意识到没有设置root密码,不知道密码自然就无法进入根用户下.到网上搜了一下,原来是这麽回事.Ubuntu的默认root密码是随机的,即每次开机都有一个新的root密码.我们可 ...

  10. Codeforce - Runtime Error

    Bahosain was trying to solve this simple problem, but he got a Runtime Error on one of the test case ...