能否通过DTD在XML属性值中使用正斜杠/?含正斜杠的枚举属性定义方法问询
首先直接给结论:XML属性值本身可以包含正斜杠/,但DTD的属性枚举选项不能直接使用带/的字符串——这就是你遇到语法错误的核心原因。
为什么你的DTD声明会报错?
DTD对属性枚举类型的选项有严格的语法要求:枚举中的每个选项必须是合法的NMTOKEN(名称标记符),而NMTOKEN的定义是只能包含字母、数字、下划线(_)、连字符(-)、点号(.)、冒号(:),斜杠/不在允许的字符范围内。
当你写(h/w | s/w)时,DTD解析器会把h当成第一个枚举选项,然后看到/,这不符合语法规则(它期待的是|或者)),所以会抛出类似"Expecting "|""、"Expecting ")""的错误,后续的错误也是因为前面的语法中断导致的连锁反应。
如何实现你的需求?
根据你的需求,有两种可行方案:
方案1:改用合法的NMTOKEN作为枚举值
把h/w和s/w替换成符合NMTOKEN规则的别名,比如hw和sw,然后在文档或业务逻辑中约定这些别名对应的实际含义。示例DTD:
<!ATTLIST item item_category (hw | sw) #REQUIRED>
对应的XML使用示例:
<item item_category="hw">...</item> <item item_category="sw">...</item>
这个方案完全符合DTD语法,能让DTD帮你验证属性值的合法性。
方案2:使用CDATA类型,在应用层做验证
如果你必须在属性值中保留h/w或s/w的写法,那么无法使用DTD的枚举验证,只能改用CDATA类型,然后在你的应用程序代码中自行验证属性值是否为允许的选项。示例DTD:
<!ATTLIST item item_category CDATA #REQUIRED>
对应的XML使用示例:
<item item_category="h/w">...</item> <item item_category="s/w">...</item>
注意:这种情况下DTD不会检查属性值是否为h/w或s/w,需要你自己在处理XML的代码中添加验证逻辑。
补充说明
如果你需要更灵活的属性值验证,也可以考虑改用XML Schema(XSD)替代DTD——XSD支持正则表达式验证,能直接约束属性值必须是h/w或s/w,比如:
<xs:attribute name="item_category"> <xs:simpleType> <xs:restriction base="xs:string"> <xs:pattern value="h/w|s/w"/> </xs:restriction> </xs:simpleType> </xs:attribute>
不过这需要你的XML解析环境支持XSD验证。
内容的提问来源于stack exchange,提问作者DjAs

