为何无element5的element2符合DTD?如何强制无element4时需element5?
问题解析与DTD修改方案
为什么最后一个<element2>被判定为有效?
你当前的DTD中,<element2>的定义是这样的:
<!ELEMENT element2 (element3,(element4?|element5+))>
这里的(element4?|element5+)是一个选择分组,逻辑是二选一:
- 分支1:
element4?—— 允许0个或1个<element4>标签(完全不写<element4>也符合这个分支的要求) - 分支2:
element5+—— 要求至少存在1个<element5>标签
你的最后一个<element2>里,<element3>之后没有任何其他子标签,刚好匹配了element4?的「0次出现」情况,所以XML解析器会判定它是有效的。
如何修改DTD满足需求?
你的核心需求是:当<element2>内不存在<element4>时,必须至少包含一个<element5>。换句话说,<element2>在<element3>之后不能为空,必须要么有<element4>,要么有至少一个<element5>。
只需要修改<element2>的DTD定义,把原来的选择分组element4?|element5+改成element4|element5+(去掉element4后面的问号,排除「0个<element4>且无<element5>」的情况):
修改后的<element2>定义:
<!ELEMENT element2 (element3,(element4|element5+))>
修改后验证:
- 包含
<element4>的<element2>(比如你XML里第一个):合法 - 无
<element4>但有多个<element5>的<element2>(比如第二个):合法 - 既无
<element4>也无<element5>的<element2>(比如第三个):不合法,完全符合你的要求
如果后续需要允许<element4>出现多次(而非原来的0/1次),可以把element4改成element4*,按需调整即可。
内容的提问来源于stack exchange,提问作者Aethalides
相关产品推荐
相关产品推荐

