XML正确DTD分析:IntelliJ生成DTD与自定义DTD对比咨询
关于XML高度元素的DTD设计建议
原始XML示例
<localHeight> <localFeet>5</localFeet> <localInches>10</localInches> </localHeight>
IntelliJ自动生成的DTD
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE localHeight[ <!ELEMENT localHeight (localFeet | localInches)*> <!ELEMENT localFeet (#PCDATA)> <!ELEMENT localInches (#PCDATA)> ]>
该DTD的问题在于:
- 允许空的
<localHeight>元素(如下XML可通过校验)
<localHeight> </localHeight>
- 允许仅包含
<localFeet>或仅包含<localInches>,甚至允许重复出现多个同类型子元素,这不符合高度数据的实际语义。
自行编写的DTD
<!DOCTYPE localHeight[ <!ELEMENT localHeight (localFeet, localInches)> <!ELEMENT localFeet (#PCDATA)> <!ELEMENT localInches (#PCDATA)> ]>
专业建议
你的思路完全正确。自动生成的DTD只是基于单个示例做的宽松语法推断,没有考虑业务场景的语义约束。
从业务逻辑来看,一个完整的高度值必然需要同时包含英尺和英寸两个部分,缺一不可,也不会重复出现。你编写的DTD强制要求<localHeight>必须同时包含<localFeet>和<localInches>,且顺序固定,能精准约束XML结构符合实际业务规则,避免出现不完整或不合理的XML内容。
如果业务上允许两个子元素的顺序调换,可以将内容模型修改为(localFeet, localInches)|(localInches, localFeet);如果业务有明确的顺序要求,当前的写法就完全满足需求。
内容的提问来源于stack exchange,提问作者pensee
相关产品推荐
相关产品推荐

