zoukankan      html  css  js  c++  java
  • BizTalk开发系列(十六) XML命名空间

    更多内容请查看:BizTalk动手实验系列目录

                          BizTalk 开发系列

    [Latest Update: 2008.10.21 11:40]

          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>

    [测试贴图]

    image

     缺省命名空间

        缺省命名空间适用于声明它的元素(如果那个元素没有命名空间前缀)和所有该元素内容中所有没有前缀的元素。假如在缺省命名空间声明里的 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。

    image 

    Xpth表达式

    //concat(local-name()," >>> ",namespace-uri())                  所有节点,包括空白字符

    //@*/concat(local-name()," >>> ",namespace-uri())            所有属性节点

    //*/concat(local-name()," >>> ",namespace-uri())               所有节点,不包括空白字符

  • 相关阅读:
    sleep和wait区别
    java学习路线图
    screen实现关闭ssh之后继续运行代码
    linux截取字符串的多种方法
    如何用Maven创建web项目(具体步骤)
    Failed to read candidate component class包冲突解决方法
    hadoop参数配置
    How to solve java.net.SocketTimeoutException:60000millis problem in HDFS
    win8style布局
    signalR的一些细节
  • 原文地址:https://www.cnblogs.com/cbcye/p/1313801.html
Copyright © 2011-2022 走看看