DOM解析器(七)

来源:互联网 发布:java高级程序设计下载 编辑:程序博客网 时间:2024/06/05 11:27

DocumentType节点


        DocumentType节点是Document节点的一个子节点。我们已经知道,解析器的parse方法将整个被解析的XML文件封装成一个Document节点返回,Document节点的两个子节点的类型分别是DocumentType类型和Element类型,其中的DocumentType节点对应着XML文件所关联的DTD文件,通过进一步获取该节点子孙节点来分析DTD文件中的数据。Document节点调用getDoctype() 返回当前节点的DocumentType子节点。


        获取DTD的基本信息


       假如XML文件中的DOCTYPE声明为:<!DOCTYPE 房子 PUBLIC  "-//ISO88//beijing//ForXML/Ch"  "b1.dtd",那么

       DocumentType节点调用getName()方法返回的是:房子
       调用getPublicId()方法返回的是:-//ISO88//beijing//ForXML/Ch
       调用getSystemId()方法返回的是:b1.dtd


        一个XML文件可以关联一个外部DTD或一个内部DTD,也可二者皆有(见第3.9节)。如果XML关联一个内部DTD,DocumentType节点调用getInternalSubset()方法可以返回内部DTD的内容。


        获取实体


        DTD文件中可以定义实体,然后与该DTD文件关联的XML文件可以通过实体引用使用该实体。实体又分为内部实体和外部实体,所谓内部实体就是实体的内容已经包含在DTD文件本身中;而外部实体是指实体的内容是DTD文件以外的其他文件。
解析器将实体封装为Entity节点,DocumentType节点调用
NamedNodeMap  getEntities()
方法可以得到全部的实体,该方法返回的NamedNodeMap对象由节点组成,这些节点可以被转换为Entity节点。Entity节点通过调用getTextContent()方法返回实体,如果实体是一个外部文件,Entity节点通过调用getInputEncoding()方法可以返回解析该实体所使用的编码;如果是内部实体,getInputEncoding()方法返回null。


CDATASection节点


        在XML文件中,标记内容中的文本数据不可以含有左尖括号、右尖括号、与符号、单引号和双引号这些特殊字符,如果想使用这些字符,办法之一是通过实体引用,如果需要许多这样的字符,文本数据中就会出现很多实体引用或字符引用,导致文本数据的阅读变得困难。使用CDATA(Character Data)段可以解决这一问题,CDATA段用“<![CDATA[”作为段的开始,用“]]>”作为段的结束,段开始和段结束之间称为CDATA段的内容,解析器不对CDATA段的内容做分析处理,因此,CDATA段中的内容可以包含任意的字符。
         在DOM规范中,解析器使用CDATASection节点封装CDATA段,CDATASection节点可以是Element的节点的子节点。


        节点数目的计算办法如下。


        首先将标记中交替出现的普通文本和CDATA段按照它们在标记中出现的先后顺序排列,如:
        普通文本1  CDATA段1  普通文本2  CDATA段2  普通文本3


       那么该标记对应的Element节点的子节点顺序如下。


1 /  Text节点:从“普通文本1”到“普通文本3”的区域,节点的文本内容是普通文本和CDATA段中的内容。
2 / CDATASection节点:从“CDATA段1”到“普通文本3”的区域,节点的文本内容是普通文本和CDATA段中的内容。
3 /  Text节点:从“普通文本2”到“普通文本3”的区域,节点的文本内容是普通文本和CDATA段中的内容。
4 / CDATASection节点:从“CDATA段2”到“普通文本3”的区域,节点的文本内容是普通文本和CDATA段中的内容。
5 / Text节点:“普通文本3”,节点的文本内容是普通文本。



        表示CDATASection节点的常量是Node.CDATA_SECTION_NODE,一个节点调用short getNodeType()方法返回的值如果等于Node.CDATA_SECTION_NODE,那么该节点就是CDATASection节点。CDATASection节点使用String getWholeText()方法获取节点中的文本,即CDATA段中的文本(包括其中的空白字符)。


注意:对于CDATASection节点,getNodeName()方法返回的是“#cdata-section”。

原创粉丝点击