当需要在项目中使用一个自定义配置的XML文档时,在web.xml的加载配置文件配置<context-param>中,运行项目后报错显示:找不到元素XXX的声明。因为 XML 语言没有预定义的标签,所以如果我们要规范XML那么就必须用到DTD文件了。这时可以在XML中使用DTD的方法,来自己定义标记,进行自定义声明。
1.xml使用DTD:
方法1:外部文件引入XML
<!DOCTYPE 根节点名称 SYSTEM "文件名.dtd">
方法2:使用内部dtd文件
<!DOCTYPE 根节点名称 [
dtd文件信息
]>
2.元素
声明节点。并指定它的子节点。
dtd:
单个子节点
<!ELEMENT a (b)>
多个子节点
<!ELEMENT a (b, c)>
声明一下子节点(也可用不声明,不声明那么就是混乱规则。)
<!ELENEET b (#PCDATA)>
<!ELEMENT c (#PCDATA)>
xml:
<a>
<b>1<b>
<c>c<c>
<a>
子节点重复多个
dtd:
<!ELEMENT a (b, c+)>
xml:
<a>
<b>1<b>
<c>c<c>
<c>c<c>
<a>
声明一个文本节点
dtd:
<!ELEMENT a (#PCDATA)>
xml:
<a>我是文本<a>
声明一个空节点
dtd:
<!ELEMENT br EMPTY>
XML:
<br />
注意:子节点可多个根节点只能有一个
3.属性
语法:
<!ATTLIST 节点名称 属性名称 CDATA #REQUIRED| #IMPLIED| #FIXED "固定的值">
例:
dtd:
<!ATTLIST filter type CDATA #REQUIRED >
xml:
<filter type="1"/>
例:FIXED的声明方式
dtd:
<!ATTLIST sender company CDATA #FIXED "Microsoft">
合法的 XML:
<sender company="Microsoft" />
非法的 XML:
<sender company="W3Schools" />
REQUIRED:必须设置该属性
IMPLIED:可以设置也可以不设置
FIXED:设置为固定值
4.元素次数限制
也就是我们指定子节点在其父节点中出现的次数
符号 | 次数 |
---|---|
+ | 1 ~ n |
* | 0 ~ n |
? | 0 ~ 1 |
不指定 | 必须也只能出现 1次 |
例:XML
<security>
<filters>
<filter type="xss">
<urls>
<url>/**</url>
</urls>
<exclude>
<rules>xss-ex</rules>
<keyWord>1</keyWord>
</exclude>
<include>
<rules>xss-in</rules>
</include>
</filter>
<filter type="sql">
<urls>
<url>/**</url>
</urls>
<exclude>
<rules>sql-ex</rules>
<keyWord>1</keyWord>
</exclude>
<include>
<rules>sql-in</rules>
</include>
</filter>
</filters>
<rule name="xss-in">
<keyWord>1</keyWord>
<keyWord>2</keyWord>
</rule>
<rule name="sql-in">
<keyWord replacement="~我是无聊的替身~">1</keyWord>
<keyWord>2</keyWord>
</rule>
<rule name="xss-ex">
<keyWord>1</keyWord>
<keyWord>2</keyWord>
</rule>
<rule name="sql-ex">
<keyWord>1</keyWord>
</rule>
</security>
例:自定义dtd声明
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE security[
<!ELEMENT security (filters+,rule+)>
<!ELEMENT filters (filter+)>
<!ELEMENT rule (keyWord+)>
<!ATTLIST rule name CDATA #REQUIRED >
<!ELEMENT filter (urls,exclude,include)>
<!ATTLIST filter type CDATA #REQUIRED >
<!ELEMENT urls (url)>
<!ELEMENT url (#PCDATA)>
<!ELEMENT exclude (rules,keyWord+)>
<!ELEMENT rules (#PCDATA)>
<!ELEMENT keyWord (#PCDATA)>
<!ATTLIST keyWord code CDATA #IMPLIED >
<!ATTLIST keyWord replacement CDATA #IMPLIED >
<!ELEMENT include (rules)>
]>
参考:
https://www.cnblogs.com/IT-CPC/p/10912621.html