找不到元素XXX的声明,XML声明自定义元素

当需要在项目中使用一个自定义配置的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

https://www.jianshu.com/p/f8d052aaf663

https://bbs.csdn.net/topics/90199938

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值