zoukankan      html  css  js  c++  java
  • Java核心技术II读书笔记(二)

    ch2 XML

    有两种XML文档结构,DTD和Schema,用解释文档构成规则,这些规则指定了每个元素俺的合法子元素和属性。

    DTD

    DTD有多种提供方式,可以像下面这样加到XML中:

    <?xml version="1.0"?>

    <!DOCTYPE configuration [    //文档类型必须匹配根元素的名字

      <!ELEMENT configuration ...>

      more rules

      ...

    ]>

    <configuration>    //根元素

      ...

    </configuration>

    当然,直接在XML中提供DTD不常用,更常用的方式是DTD放在外面。用SYSTEM声明。

    <!DOCTYPE configuration SYSTEM "config.dtd"> //相对于当前XML文档的路径,因为是相对路径,解析器要能够定位,要么是File或Url对象,要么是InputStream加实体解析器来定位。

    <!DOCTYPE configuration SYSTEM "http://myserver.com/config.dtd">

    还有一种所谓的“总所周知”的DTD机制:

    <!DOCTYPE web-app

      public "-//Sun Microsystems, Inc.//DTD Web Application 2.2//EN"   //publicId

      "http://java.sun.com/j2ee/dtds/web-app_2_2.dtd">  //systemId

    如果解析器能定位public,就不需要http那段了

    然后书中给了一段代码和一句洋文翻译过来的话,“如果你使用的是DOM解析器,并且想要支持PUBLIC标识符,请调用DocumentBuilder类的setEntityResolver方法来安装EntityResolver接口的某个实现类的一个对象”。

    啥叫支持public标识符?难道是上面的public "-//Sun ...?看样子是的。

    class MyEntityResolver implements EntityResolver{  //EntityResolver的实现类

      public InputSource resolveEntity(String publicID, String systemID){

        if(publicID.equals(a known ID)){

          return new InputSource(DTD data);  //这里就是支持public标识符的设置了吧,简单的说就是解析器能够通过public标识符来定位其指定的DTD文档  

        }else{

          return null;

        }

      }

    }

    真TM绕口,直接看下JDK DocumentBuilder的方法说明:

      setEntityResolver(EntityResolver er) //EntityResolver接口的某个实现类的一个对象
    Specify the EntityResolver to be used to resolve entities present in the XML document to be parsed.

    明白了。

     然后我们就知道,DTD是通过上面这些方式来定位了。

    好了,接下来说说具体的。ELEMENT规则用于指定某个元素有什么样的子元素,可以是正则表达式。

    <!ELEMENT menu (item)*>   //menu元素包含0或多个item元素

    <!ELEMENT font (name,size)>

    <!ELEMENT name (#PCDATA)>

    <!ELEMENT size (#PCDATA)>

    <!ELEMENT chapter (intro, (heading, (para|image|table|note)+)+) //元素嵌套

    包含被解析文本#PCDATA的规则有两种,只包含文本、文办加标签:

    <!ELEMENT para (#PADATA)>

    <!ELEMENT para (#PADATA|em|strong|code)*>

    非法的例子:

    <!ELEMENT para (image,#PCDATA)>

    ------------------------------------------------------

    描述元素属性的语法规则:

    <!ATTLIST element attribute type default>

    典型例子:

    <!ATTLIST font style (plain|bold|italic|bold-italic) "plain">   //style属性,有4个值,默认为plain

    <!ATTLIST size unit CDATA #IMPLIED>  //这里的CDATA与前面XML中的<![CDATA[...]>是没关系的,这里指任意字符串

    DTD实体的定义与引用:

    <!ENITY back.label "Back">

    <menumitem label="&back.label;"/>

    DTD介绍完毕。

     用法:

    factory.setValidating(true);   //启用DTD验证

    factory.setIgnoringElementWhitespace(true);  //去掉空格验证

  • 相关阅读:
    【瞎口胡】CDQ 分治
    题解 Luogu P2934 [USACO09JAN]Safe Travel G
    【瞎口胡】线段树优化建图
    git did not exit cleanly (exit code 128)如何解决
    转贴Linux服务器性能评估
    小记 SqlHelper
    zookeeper安装部署
    zookeeper原理介绍
    zookeeper基本操作
    zookeeper四字命令
  • 原文地址:https://www.cnblogs.com/runwulingsheng/p/5420271.html
Copyright © 2011-2022 走看看