看log4j的官方文档,上面说提供了XML格式的配置,但是没有XML具体示例。发现文档中说的是一个DTD文档,但我根本不知道DTD是什么,于是就简单了解一下。顺带做一下笔记。

注:结合笔记看log4j的DTD配置文件顿时好理解多了,不过一个完成的 log4j 的XML文件还是参照已有文件最好,不然自己拼太麻烦了..


一、DOCTYPE 声明:(分为内部和外部)

内部声明:<!DOCTYPE 根元素 [元素声明]>

外部声明:<!DOCTYPE 根元素 SYSTEM "文件名">

二、XML 文档构建模块

2.1 元素概括:

2.1.1 文档构建模块

所有的 XML 文档(以及 HTML 文档)均由以下简单的构建模块构成:

  • 元素

  • 属性

  • 实体

  • PCDATA

  • CDATA

2.1.2 常用个数语法:

2.2 元素(ELEMENT)

2.2.1 定义:

XML 元素的例子是 "note" 和 "message" 。元素可包含文本、其他元素或者是空的。

2.2.2 声明元素:

语法:<!ELEMENT 元素名称 类别> 或者 <!ELEMENT 元素名称 (元素内容)> (元素内容应该是指子元素)

其他元素说明:

  • 空元素:<!ELEMENT 元素名称 EMPTY> ()

  • 只有 PCDATA 的元素:<!ELEMENT 元素名称 (#PCDATA)>

  • 带有任何内容的元素:<!ELEMENT 元素名称 ANY>

  • 带有子元素(序列)的元素:<!ELEMENT 元素名称 (子元素名称 1)><!ELEMENT 元素名称 (子元素名称 1,子元素名称 2,.....)> (当子元素按照由逗号分隔开的序列进行声明时,这些子元素必须按照相同的顺序出现在文档中。在一个完整的声明中,子元素也必须被声明,同时子元素也可拥有子元素。)

  • 声明只出现一次的元素:<!ELEMENT 元素名称 (子元素名称+)>

  • 声明出现零次或多次的元素:<!ELEMENT 元素名称 (子元素名称*)>

  • 声明出现零次或一次的元素:<!ELEMENT 元素名称 (子元素名称?)>

  • 声明“非.../既...”类型的内容:<!ELEMENT note (to,from,header,(message|body))>

  • 声明混合型的内容:<!ELEMENT note (#PCDATA|to|from|header|message)*>

2.2.3 元素类型:

2.3 属性(ATTLIST):属性依附于元素存在

2.3.1 定义和声明语法

属性可提供有关元素的额外信息。属性总是被置于某元素的开始标签中。属性总是以名称/值的形式成对出现的。

属性通过 ATTLIST 声明来进行声明:<!ATTLIST 元素名称 属性名称 属性类型 默认值>

2.3.2 属性类型

  • ID:表明该属性的取值必须是唯一的。

  • IDREF/IDREFS: IDREF是指它的值要指向文档当中其它地方声明的ID。把IDREF当成数据库的外键,把ID当成主键理解就行; IDREFS同IDREF,但是可以具有由空格分开的多个引用;

  • Enumerated:预先定义了一些值,属性的值必须在所列出的值的范围内

2.3.3 属性特点

  • #REQUIRED:表示元素的所有的实例都必须有该属性的值(NOT NULL)

  • #IMPLIED:表示该属性的值是可以被忽略的。

  • #FIXED:该属性的值必须为指定的固定值。

  • Default:为属性提供一个默认的值。

2.4 实体(ENTITY)

定义:实体是用来定义普通文本(或特殊字符的快捷方式)的变量。实体引用是对实体的引用。(简单理解就是C#中的常量)

声明:实体可在内部或外部进行声明:

内部实体声明:<!ENTITY 实体名称 "实体的值">

外部实体声明:<!ENTITY 实体名称 SYSTEM "URI/URL">

XML 中被预定义的实体:

2.5 PCDATA

PCDATA 的意思是被解析的字符数据(parsed character data)。

可把字符数据想象为 XML 元素的开始标签与结束标签之间的文本。

注:可以包含任何字符串数据,但不能包含子元素。

2.6 CDATA

CDATA 的意思是字符数据(character data)。

CDATA 是不会被解析器解析的文本。在这些文本中的标签不会被当作标记来对待,其中的实体也不会被展开。

三、对比:PCDATA 和 CDATA

问题一:属性的CDATA与元素的CDATA节有何区别呢??

属性的CDATA表示属性值是任何的字符,元素里的CDATA节是表示在CDATA节里面的内容不被xml文档进行解析。

问题二:#PCDATA与CDATA有何区别??

PCDATA是限制元素里面的内容是字符类型的,而这个CDATA是限制属性里面的内容是字符类型。

四、Schema技术

暂不处理:后续进行补充:xml基础、DTD验证、Schema验证 - CSDN博客

五、附录

  1. xml基础、DTD验证、Schema验证(备忘) - CSDN博客 (很不错的一个教程,说的很详细,总结的也很详细)

  2. DTD 教程 (W3School几乎成为我学东西的首选地方了.....)

  3. Log4j使用详解(log4j.XML格式)——整理 - 快鸟 - 博客园 (log4j的XML配置文件详解)

DTD的学习和理解的更多相关文章

  1. 【log4j】的学习和理解 + 打印所有 SQL

    log4j 1.2 学习和理解 + 打印所有 SQL 一.基本资料 官方文档:http://logging.apache.org/log4j/1.2/manual.html(理解基本概念和其他) lo ...

  2. SQL Server 学习博客分享列表(应用式学习 + 深入理解)

    SQL Server 学习博客分享列表(应用式学习 + 深入理解) 转自:https://blog.csdn.net/tianjing0805/article/details/75047574 SQL ...

  3. JDK学习---深入理解java中的HashMap、HashSet底层实现

    本文参考资料: 1.<大话数据结构> 2.http://www.cnblogs.com/dassmeta/p/5338955.html 3.http://www.cnblogs.com/d ...

  4. JDK学习---深入理解java中的LinkedList

    本文参考资料: 1.<大话数据结构> 2.http://blog.csdn.net/jzhf2012/article/details/8540543 3.http://blog.csdn. ...

  5. python基础知识的学习和理解

    参考链接:https://github.com/yanhualei/about_python/tree/master/python_learning/python_base   python基础知识笔 ...

  6. STM32学习笔记(四) RCC外设的学习和理解

    RCC时钟模块并不好理解,初次接触我也是一头雾水,而且我真正掌握它的时候也比较晚,是我在学习uC/os-II,需要分析时钟时才有了深刻认识.但在学习中我却一定要把放在了前列,因为这是整个嵌入式最重要的 ...

  7. javaweb回顾第一篇servlet的学习和理解

    前言:关于servlet相信学过java的都不会陌生,我最近又把这些基础知识整理一遍,便于自已能更好的理解ssm或者ssh,下面开始 1:Servlet接口 servlet有5个方法下面分别简单的介绍 ...

  8. PHP面向对象三大特点学习(充分理解抽象、封装、继承、多态)

    PHP面向对象三大特点学习 学习目标:充分理解抽象.封装.继承.多态   面象对向的三大特点:封装性.继承性.多态性 首先简单理解一下抽象:我们在前面定义一个类的时候,实际上就是把一类事物共有的属性和 ...

  9. 深度学习研究理解5:Visualizing and Understanding Convolutional Networks(转)

    Visualizing and understandingConvolutional Networks 本文是Matthew D.Zeiler 和Rob Fergus于(纽约大学)13年撰写的论文,主 ...

随机推荐

  1. ubuntu下配置.net core运行环境

    Ubuntu 16.4执行: sudo sh -c 'echo "deb [arch=amd64] https://apt-mo.trafficmanager.net/repos/dotne ...

  2. C语言指针的易错点

    1.内存泄漏:申请的堆内存没有释放. 2.内存污染:前面非法操作使用内存(没有报错),后面写着写着就出错.如下代码: 当结构体中只有划线部分代码时,在编译器中编写不会报错,但此时已经造成非法操作内存, ...

  3. ⽤运营的思路来做无线产品測试-第13届BQConf上的分享

    ⽤运营的思路来做无线产品測试,在2014.10.25.第13届B'QConf(北京软件质量大会)上分享的一个主题.主要是关于京东无线測试的一些实践,包含android和ios的代码覆盖率.无线的接口自 ...

  4. SpringCloud系列十六:Feign使用Hystrix

    1. 回顾 上文讲解了使用注解@HystrixCommand的fallbackMethod属性实现回退.然而,Feign是以接口形式工作的, 它没有方法体,前文讲解的方式显然不适用与Feign. 事实 ...

  5. struts2 在拦截器进行注入(依据Action是否实现自己定义接口)

    比如:经常在Action中都须要获取当前登录的User,就须要获取Session.然后从Session获取当前登录的User,由于这些步骤都是反复操作,能够想办法在拦截器中进行实现.能够自己定义一个接 ...

  6. Excel累加上一行的数值

    默认一拖是每一行+1,现在想加任意: =A1+X 然后一拖就可以加X了.

  7. Atitit.检测文本文件的编码 自动获取文件的中文编码

    Atitit.检测文本文件的编码 自动获取文件的中文编码 1 不能使用load来检测编码..1 2 使用convert来检测编码1 3 程序检测文本编码2 3.1 根据utf bom头2 3.2 检测 ...

  8. [elk]logstash的最佳实战-项目实战

    重点参考: http://blog.csdn.net/qq1032355091/article/details/52953837 不得不说这是一个伟大的项目实战,是正式踏入logstash门槛的捷径 ...

  9. mui中删除某个节点的子节点

    targetNode.removeChild(targetNode.firstElementChild);//删除元素的第一个子节点

  10. JDBC深度封装的工具类 (具有高度可重用性)

    首先介绍一下Dbutils:    Common Dbutils是操作数据库的组件,对传统操作数据库的类进行二次封装,可以把结果集转化成List. 补充一下,传统操作数据库的类指的是JDBC(java ...