新书推介:《语义网技术体系》
作者:瞿裕忠,胡伟,程龚
   XML论坛     W3CHINA.ORG讨论区     计算机科学论坛     SOAChina论坛     Blog     开放翻译计划     新浪微博  
 
  • 首页
  • 登录
  • 注册
  • 软件下载
  • 资料下载
  • 核心成员
  • 帮助
  •   Add to Google

    >> 本版讨论DOM, SAX, XPath等。
    [返回] 中文XML论坛 - 专业的XML技术讨论区XML.ORG.CN讨论区 - XML技术『 DOM/SAX/XPath 』 → SAX教程系列五(SAX与名称空间)---来源:IBM developerWorks 查看新帖用户列表

      发表一个新主题  发表一个新投票  回复主题  (订阅本版) 您是本帖的第 5568 个阅读者浏览上一篇主题  刷新本主题   平板显示贴子 浏览下一篇主题
     * 贴子主题: SAX教程系列五(SAX与名称空间)---来源:IBM developerWorks 举报  打印  推荐  IE收藏夹 
       本主题类别:     
     yuji1998 帅哥哟,离线,有人找我吗?魔羯座1981-12-22
      
      
      威望:5
      头衔:蓝色先锋
      等级:大二(研究C++)
      文章:212
      积分:1059
      门派:XML.ORG.CN
      注册:2004/4/10

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给yuji1998发送一个短消息 把yuji1998加入好友 查看yuji1998的个人资料 搜索yuji1998在『 DOM/SAX/XPath 』的所有贴子 访问yuji1998的主页 引用回复这个贴子 回复这个贴子 查看yuji1998的博客楼主
    发贴心情 SAX教程系列五(SAX与名称空间)---来源:IBM developerWorks

    欢迎您通过电子邮件nicholas@nicholaschase.com直接与作者 Nicholas Chase 联系。
    注:本教程仅供本站成员的学习和研究使用,严禁用于商业目的!

    名称空间
         SAX 20 版的一个主要增强是添加了对名称空间的支持,名称空间允许开发人员无冲突地使用不同来源或具有不同用途的信息。这通常出现在生产环境中,生产环境中的 SAX 数据流中的数据可能来自许多不同的来源。
    名称空间是一个概念范围,其中的所有名称都需要是唯一的。
    例如,我过去常在这样一间办公室工作,我的名字和那里的一位客户相同。如果我在办公室,而接待员宣布“Nick,请接 1 号电话,”那么每个人都知道她指的是我,因为我在“办公室”名称空间中。类似地,如果她宣布“Nick 在一号线上,”每个人都知道她指的是那位客户,因为呼叫者在办公室名称空间之外。
    另一方面,如果我出了办公室,而她做出相同的宣布,混淆就可能产生,因为两种可能性都存在。
    当 XML 数据库由多种来源组合而成时,同样的问题也会产生,比如本教程稍后将会详细描述的示例文件中修订过的调查信息。
         创建名称空间
         由于名称空间的标识符必须是唯一的,因而使用统一资源标识符(或 URI)来指定它们。例如,本教程的示例数据的默认名称空间将使用 xmlns 属性来指定:
    <?xml version="1.0"?>
    <surveys xmlns="http://www.nicholaschase.com/surveys/">
    <response username="bob">
       <question subject="appearance">A</question>
    没有指定名称空间的任何节点都在默认名称空间 http://www.nicholaschase.com/surveys/中。实际的 URI 本身并没有表示任何意义。信息可能在也可能没有在该地址,重要的是它必须是唯一的。
    注意到默认名称空间和根本没有名称空间之间的巨大区别是很重要的。在本例中,没有名称空间前缀的元素都在默认名称空间中。以前,当不存在默认名称空间时,那些元素就不在任何名称空间中。当您处理关于属性的名称空间时,这个区别就变得重要了。
    您还可以创建次级名称空间,并向它们添加元素或属性。
         指定名称空间
         也可以为数据指定其他名称空间。例如,通过创建一个 revised 名称空间,您可以添加第二组数据,比如后期催眠,而不致干扰原先的数据。
    名称空间连同别名通常在在文档的根元素上(但不一定是这样)创建。当正在使用多个名称空间时,这个别名根据需要用作元素或属性的前缀,以指定正确的名称空间。请考虑下面的 XML 代码片断:
    <?xml version="1.0"?>
    <surveys xmlns="http://www.nicholaschase.com/surveys/"
             xmlns:revised="http://www.nicholaschase.com/surveys/revised/">
    <response username="bob">
       <question subject="appearance">A</question>
       <question subject="communication">B</question>
       <question subject="ship">A</question>
       <question subject="inside">D</question>
       <question subject="implant">B</question>

       <revised:question subject="appearance">D</revised:question>
       <revised:question subject="communication">A</revised:question>
       <revised:question subject="ship">A</revised:question>
       <revised:question subject="inside">D</revised:question>
       <revised:question subject="implant">A</revised:question>
       
    </response>
    <response username="sue">
    它使用了名称空间和别名 revised 来创建 question 元素。
    记住 revised: 不是名称空间,而是别名!实际的名称空间是 http://www.nicholaschase.com/surveys/revised/。
         检查名称空间
    正如startElement()中简要地提及到的,SAX 2.0 版添加了用于识别不同名称空间的功能。
    您可以通过多种方式使用这三种新能力,但是首先要确保结果中仅出现原先的答案。否则,Bob 的答案就会被重复计数。
    由于只有当 thisElement 是 "question" 时才会记录答案,您应该在设置该变量之前执行检查。
    . public void startElement(
                 String namespaceURI,
                 String localName,
                 String qName,
                 Attributes atts)
                    throws SAXException {
       if (namespaceURI ==
         "http://www.nicholaschase.com/surveys/") {
          if (localName == "question") {
             thisQuestion = atts.getValue("subject");
          }
       }

      
       thisElement = localName;
    }
    ...
    注意应用程序实际上是在检查名称空间 URI(或像本例中一样是 URL),而不是检查别名。
         关于属性的名称空间
    属性也可能属于某个特定的名称空间。例如,如果问题的名称在第二回合的调查中发生了变化,您可以添加第二个相关的属性 revised:subject,比如:
    <?xml version="1.0"?>
    <surveys xmlns="http://www.nicholaschase.com/surveys/"
             xmlns:revised="http://www.nicholaschase.com/surveys/revised/">
    <response username="bob">
       <question subject="appearance">A</question>
       <question subject="communication">B</question>
       <question subject="ship">A</question>
       <question subject="inside">D</question>
       <question subject="implant">B</question>
       <revised:question subject="appearance"
    revised:subject="looks">D</revised:question>
       <revised:question subject="communication">A</revised:question>
       <revised:question subject="ship">A</revised:question>
       <revised:question subject="inside">D</revised:question>
       <revised:question subject="implant">A</revised:question>
    </response>
    <response username="sue">
    关于属性的稍微有点奇怪的地方在于,它们 永远不会 在默认名称空间中。即使已经声明了一个默认名称空间,没有前缀的属性也被认为是根本就没有名称空间。这意味着 response 在 http://www.nicholaschase.com/surveys/ 名称空间中,但是其属性 username 却不在该名称空间中。 这只是 XML 推荐标准的定义本身存在的一个奇怪之处。
    Attributes 列表具有允许您确定属性的名称空间的方法。这些方法,即 getURI() 和 getQName,使用起来非常类似元素本身的 qname 和 localName。
    名称空间的奇怪之处
    SAX 解析器处理本地名称和 QName 的方式可能有点奇怪。例如,除非专门打开名称空间处理,否则默认的 Java 解析器就不会报告本地名称的值:
    ...
       try {

          SAXParserFactory spfactory = SAXParserFactory.newInstance();
          spfactory.setValidating(false);
          spfactory.setFeature("http://xml.org/sax/features/namespace-prefixes",
                  true);
          spfactory.setFeature("http://xml.org/sax/features/namespaces",
                  true);
             
          SAXParser saxParser = spfactory.newSAXParser();
    ...
    如果获取信息有困难,可尝试设置解析器的这些特性。


       收藏   分享  
    顶(0)
      




    ----------------------------------------------
    私人网站:蓝尚WEB商务平台http://www.lanshang.com     建站黄页:http://www.lanshang.com/link.asp WEB技术文库:http://www.lanshang.com/wenzhang/ 
    电子书籍: http://www.lanshang.com/ebook/  技术交流:http://www.lanshang.com/bbs/

    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2004/5/31 0:25:00
     
     GoogleAdSense魔羯座1981-12-22
      
      
      等级:大一新生
      文章:1
      积分:50
      门派:无门无派
      院校:未填写
      注册:2007-01-01
    给Google AdSense发送一个短消息 把Google AdSense加入好友 查看Google AdSense的个人资料 搜索Google AdSense在『 DOM/SAX/XPath 』的所有贴子 访问Google AdSense的主页 引用回复这个贴子 回复这个贴子 查看Google AdSense的博客广告
    2024/3/29 12:34:05

    本主题贴数1,分页: [1]

     *树形目录 (最近20个回帖) 顶端 
    主题:  SAX教程系列五(SAX与名称空间)---来源:IBM developerWorks..(5732字) - yuji1998,2004年5月31日

    W3C Contributing Supporter! W 3 C h i n a ( since 2003 ) 旗 下 站 点
    苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》
    7,562.500ms