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

    >> 关于 XML 的一般性技术讨论,提供 XML入门资料 和 XML教程
    [返回] 中文XML论坛 - 专业的XML技术讨论区XML.ORG.CN讨论区 - XML技术『 XML基础 』 → 请问各位大哥大姐,实体的引用是怎么会回事啊 查看新帖用户列表

      发表一个新主题  发表一个新投票  回复主题  (订阅本版) 您是本帖的第 27809 个阅读者浏览上一篇主题  刷新本主题   树形显示贴子 浏览下一篇主题
     * 贴子主题: 请问各位大哥大姐,实体的引用是怎么会回事啊 举报  打印  推荐  IE收藏夹 
       本主题类别:     
     小葱 帅哥哟,离线,有人找我吗?
      
      
      等级:大一新生
      文章:7
      积分:82
      门派:XML.ORG.CN
      注册:2005/5/4

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给小葱发送一个短消息 把小葱加入好友 查看小葱的个人资料 搜索小葱在『 XML基础 』的所有贴子 引用回复这个贴子 回复这个贴子 查看小葱的博客11
    发贴心情 

    太谢谢大家的解释,说的好明白啊。还想请教一下,斑竹Or给我那么完整的回答,是原创的么?可以把剩下内容也发上来么?因为写的真的很详细,很容易看明白啊。
    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2005/5/16 22:17:00
     
     Qr 帅哥哟,离线,有人找我吗?
      
      
      威望:9
      等级:博士二年级(版主)
      文章:4392
      积分:29981
      门派:XML.ORG.CN
      注册:2004/5/15

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给Qr发送一个短消息 把Qr加入好友 查看Qr的个人资料 搜索Qr在『 XML基础 』的所有贴子 访问Qr的主页 引用回复这个贴子 回复这个贴子 查看Qr的博客12
    发贴心情 
    这是从偶上传的“初学进阶”里的COPY来的:)搜索偶发的贴子,上面有下载。

    ----------------------------------------------
    没人帮忙,那就靠自己,自己才是最好的老师!本人拒绝回答通过站内短消息提出的问题!

    blog:http://Qr.blogger.org.cn

    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2005/5/17 10:10:00
     
     qianky 帅哥哟,离线,有人找我吗?
      
      
      等级:大一新生
      文章:7
      积分:82
      门派:XML.ORG.CN
      注册:2005/5/15

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给qianky发送一个短消息 把qianky加入好友 查看qianky的个人资料 搜索qianky在『 XML基础 』的所有贴子 引用回复这个贴子 回复这个贴子 查看qianky的博客13
    发贴心情 
    实体在数据库方面是应该可以理解为数据字典吧
    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2005/5/17 22:20:00
     
     qiongqiong 美女呀,离线,快来找我吧!
      
      
      等级:大一新生
      文章:4
      积分:75
      门派:XML.ORG.CN
      注册:2005/11/4

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给qiongqiong发送一个短消息 把qiongqiong加入好友 查看qiongqiong的个人资料 搜索qiongqiong在『 XML基础 』的所有贴子 引用回复这个贴子 回复这个贴子 查看qiongqiong的博客14
    发贴心情 
    那个<地址>&B公司地址〈/地址〉是不电应该改为:<地址>&B公司地址;〈/地址〉呀
    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2005/12/1 20:57:00
     
     billygao 帅哥哟,离线,有人找我吗?
      
      
      等级:大一新生
      文章:5
      积分:76
      门派:XML.ORG.CN
      注册:2005/11/14

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给billygao发送一个短消息 把billygao加入好友 查看billygao的个人资料 搜索billygao在『 XML基础 』的所有贴子 引用回复这个贴子 回复这个贴子 查看billygao的博客15
    发贴心情 
    实体是主要是用来为重用和维护XML文档服务的,同时实体也是XML文档的物理存在形式。简单的说,实体就象是对一个长字符串的一种缩写,其中这个缩写就是实体的名称,而原来的长字符串就是实体的内容。以下是我曾经整理的一些东西,放上来给大家看看:
    3.4.1 内部通用实体声明
    在XML中预定义有五个实体声明,分别是:
    &lt;
    小于号;(<)
    &gt;
    大于号(>)
    &amp;
    and的符号标记(&)
    &quot;
    双引号(")
    &apos;
    单引号(')

    实体声明的语法是以“<!ENTITY”,后面跟有实体名称,这个名称必须是一个合法的XML名称,然后是要被替换的文本实体,最后以“>”结束。引用W3C的定义规范:
    W3C规范 3 6
    [71]    GEDecl    ::=    '<!ENTITY' S Name S EntityDef S? '>'


    例如,下面是一个简单的实体引用声明:
    <!ENTITY PS "PostScript">

    当声明了这样的一个标记后,就可以在任何地方使用PS来代替“PostScript”这一段文字,这样可以就不用每次都输一次完整的文字,也可以避免许多拼写错误。在XML文档中引用一个声明的实体用“&”后面跟上实体名。前面例子中声明的实体PS,可以用&PS来引用这个实体。
    实体的内容可以包含标记字符。例如:下面声明一个footer的标记,用来表示一个网页中的页脚:

    <!ENTITY footer
    '<hr size="1" noshade="true"/>
    <font CLASS="footer">
    <a href="index.html">My Home</a> |
    <a href="sales/mygoods/">My Goods</a> |
    <a href="new/">News</a> |
    <a href="support/contact.html">Contacts</a><br>
    <a href="support/about.html">About our</a> |
    </font>
    <p>
    <font CLASS="copy">
    Copyright 2004, Personal&amp;House Inc.<br/>
    <a href="mailto:webmaster@PH.com">webmaster@PH.com</a>
    </font>
    </p>
    '>

    可以用在XML文档实例中引用这个实体来替代那一大段文本,而且这段文本中含有标记字符。
    如果不用实体引用的方式,那就只能用CDATA段来把这段文本嵌入到XML文档中了。在声明实体时,要注意的是在实体被替换后,文档仍然要符合良构要求的,即不能把一个开始标记声明在一个实体中,而把另一个实体声明在另一个实体中。另外也要注意对引号的匹配,实体内容的引号不要与起分隔作用的引号相同。
    声明了实体,这个实体可以在XML文档实例中被引用,也可以DTD中的其它实体声明中被引用,因为其它实体声明最终也是要被应用到XML文档中。但要注意的是:
    实体声明中不允许出现循环引用,如下面例子就是无效的:
    <!ENTITY LOOP1 "&LOOP2 is invalid">
    <!ENTITY LOOP2 "&LOOP1 is invalid">
    实体引用不能出现在不成为XML文档内容的其它DTD部分,如下面的例子也是无效的:
    <!ENTITY PC "(#PCDATA)">
    <!ELEMENT INVALID &PC>

    3.4.2 外部通用实体声明
    包含在主文档实体以外的数据称为外部实体,通过外部实体引用可在主文档中嵌入若干独立的外部文件组建一个更大的XML文档。
    外部通用实体声明与内部通用实体声明类似,也是以“<!ENTITY”开始,后面跟实体名,但接着的部分不同了,不再是直接的一个替换文本,而是一个SYSTEM或PUBLIC的关键字,关键字后面跟有URI。一个URI可以理解为是一个多用途的URL。例如前一节中名为footer的内部实体声明,可以把它单独保存了一个XML文档,从而成为一个外部实体。然后在另一个引用它的XML文档中使用外部实体声明语法进行声明。例如下面的例子:

    <?xml version = "1.0" encoding="UTF-8" ?>
    <footer>
    <hr size="1" noshade="true"/>
    <font CLASS="footer">
    <a href="index.html">My Home</a> |
    <a href="sales/mygoods/">My Goods</a> |
    <a href="new/">News</a> |
    <a href="support/contact.html">Contacts</a><br>
    <a href="support/about.html">About our</a> |
    </font>
    <p>
    <font CLASS="copy">
    Copyright 2004, Personal&amp;House Inc.<br/>
    <a href="mailto:webmaster@PH.com">webmaster@PH.com</a>
    </font>
    </p>
    </footer>

    这样就可以在另一个XML文档的DTD中声明一个外部引用,如下面所示:
    <!ENTITY footer SYSTEM http://www.PH.com/externalentity/footer.xml>
    当然也可以使用相对路径的方式来声明一个外部引用,如下面所示:
    <!ENTITY footer SYSTEM "/externalentity/footer.xml">
    这样声明了这上外部实体后,就可以在XML文档实例中使用外部实体引用的方式&footer;对这个外部实体进行引用。当使用了外部实体引用后,由于文档不再是完整的,所以在XML声明中的standalone属性值现在要设为"no"。要注意的是,作为外部实体的XML文档不能有自己的文档类型声明部分,这就意味着在外部实体中出现的元素和属性声明要在引用它的主XML文档中声明。

    3.4.3 内部参数实体声明
    通用实体会成为文档的一部分,但是不是DTD的组成部分。通用实体引用只能出现在DTD的其它通用实体引用中,但不能被DTD的其它部分引用。如果要让实体被DTD的其它部分引用,就要使用参数实体,按照W3C的规范定义,参数实体是只能出现在DTD中的一种实体,它不能在文档实例中被引用。参数实体的声明语法与通用实体类似,只是在实体的名字前要加一个“%”。完整的语法定义如下:
    W3C规范 3 7
    72]    PEDecl    ::=    '<!ENTITY' S '%' S Name S PEDef S? '>'


    与内部通用实体的功用类似,内部参数实体主要是为了重用性,当一个DTD声明在多个地方出现时,用一个参数实体代替可以减少代码数量和出错的概率,同时也方便修改,在修改时只要更改参数实体,就可以应用到所有有参数实体引用的地方。例如下面这个例子中,出租的类型中有公寓和转租房,出售的类型中有小屋、单间和套房。每种类型都有相同的元素,但又有不同的元素。如果不用参数实体引用,就要分别对每个元素都重复声明。使用了参数实体引用后,可以简化这个DTD声明。没有替换前的文档如下:

    <!ELEMENT apartment (address, footage, rooms, baths, rent)>
    <!ELEMENT sublet    (address, footage, rooms, baths, rent)>
    <!ELEMENT coop      (address, footage, rooms, baths, price)>
    <!ELEMENT condo     (address, footage, rooms, baths, price)>
    <!ELEMENT house     (address, footage, rooms, baths, price)>

    如果使用参数实体,可以声明三个参数实体:
    <!ENTITY % residential_content "address, footage, rooms, baths">
    <!ENTITY % rental_content      "rent">
    <!ENTITY % purchase_content    "price">


    这样前面的DTD声明可以改为下面这种形式:
    <!ELEMENT apartment(%residential_content;,%rental_content;)>
    <!ELEMENT sublet (%residential_content;, %rental_content;)>
    <!ELEMENT coop  (%residential_content;, %purchase_content;)>
    <!ELEMENT condo (%residential_content;,%purchase_content;)>
    <!ELEMENT house (%residential_content;,%purchase_content;)>

    通过使用参数实体引用后,简化了文档声明;而且如果以后对DTD声明有更改的时候,只要对参数实体统一作修改,就可以应用到每个引用的声明中。避免了对每一个元素声明的修改。

    3.4.4 外部参数实体声明
    类似于通用实体,参数实体也有分内部和外部,而且语法上也是类似,只是把实体内容更改成通过使用SYSTEM或PUBLIC关键字后面跟一个URI的方式引用一个声明在外部的文档实体。完整的语法如下:
    W3C规范 3 8
    [75]    ExternalID    ::=    'SYSTEM' S SystemLiteral

      | 'PUBLIC' S PubidLiteral S SystemLiteral


    使用外部参数实体的一个主要原因是为了方便文档的管理,把大型、复杂的DTD文档分解成几个小的DTD文档,这样可以降低这个DTD的复杂程度,例如完整的SVG、XHTML和DocBook 的DTD都有相当的规模,通过把它分解成许多DTD的片断,可以大大的方便阅读和维护。下面是一个DocBook的DTD:


    3.5 未解析实体声明
    由于并非所有的数据都可以表示成XML形式,特别非文本数据。但在实际应用中又会有这样的需求,因此,有必要考虑如何在XML文档中嵌入非文本数据。
    在HTML页面中对于不同类型的数据会有不同的处理方式,例如对图像可以通过<IMG>标记来嵌入,通过SRC属性图像文件的位置;对于JAVA程序可以通过<APPLET>标记来实现。还有声音等其它的类型也有相应的标记来实现。
    在XML中也可以但除非是为了兼容性考虑,一般不会用这种方法实现。相反,XML可以通过使用未解析实体引用这些内容。
    W3C规范 3 9
    [76]    NDataDecl    ::=    S 'NDATA' S Name


    所有的未解析实体都是外部实体,因为无法用XML实体表示非XML信息。同时它们都是通用实体,因为禁止在XML DTD中嵌入数据。从语法上看,未解析实体通过后接记法名称(Notation Name)的NDATA关键字将未解析实体与其它外部实体声明加以区别。最后的Name是一个记法声明名称。

    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2005/12/2 10:30:00
     
     billygao 帅哥哟,离线,有人找我吗?
      
      
      等级:大一新生
      文章:5
      积分:76
      门派:XML.ORG.CN
      注册:2005/11/14

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给billygao发送一个短消息 把billygao加入好友 查看billygao的个人资料 搜索billygao在『 XML基础 』的所有贴子 引用回复这个贴子 回复这个贴子 查看billygao的博客16
    发贴心情 
    不好意思,最后一段有关DocBook的DTD不知什么时候弄丢了,在我原来的文档中也找不到了,不过如果谁有兴趣,可以到w3.org的网站去看看。
    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2005/12/2 10:34:00
     
     GoogleAdSense
      
      
      等级:大一新生
      文章:1
      积分:50
      门派:无门无派
      院校:未填写
      注册:2007-01-01
    给Google AdSense发送一个短消息 把Google AdSense加入好友 查看Google AdSense的个人资料 搜索Google AdSense在『 XML基础 』的所有贴子 访问Google AdSense的主页 引用回复这个贴子 回复这个贴子 查看Google AdSense的博客广告
    2024/5/14 0:38:50

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

    管理选项修改tag | 锁定 | 解锁 | 提升 | 删除 | 移动 | 固顶 | 总固顶 | 奖励 | 惩罚 | 发布公告
    W3C Contributing Supporter! W 3 C h i n a ( since 2003 ) 旗 下 站 点
    苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》
    90.820ms