更正 XML 的 DTD,分析 Intellij 生成的 DTD

Correct DTD for XML, analyzing Intellij generated DTD

提问人:pensee 提问时间:8/19/2023 更新时间:8/19/2023 访问量:25

问:

有一个 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)>  

]> 

这甚至适用于此 XML :

<localHeight>
</localHeight> 

它没有任何其他元素。
使用 |表示它包含 localFeet 或 localInches 标记。
我想出了以下DTD:

<!DOCTYPE localHeight[
<!ELEMENT localHeight (localFeet, localInches)>  
<!ELEMENT localFeet (#PCDATA)>  
<!ELEMENT localInches (#PCDATA)>  

]>  

这也是正确的,但可能比 IntelliJ 生成的 DTD 更精确地表达它。需要一些输入,因为我不确定我在这里是否在思考正确的路线

XML IntelliJ-idea DTD

评论

2赞 Yitzhak Khabinsky 8/19/2023
最好切换到 XML 架构 (XSD)。它们要先进得多。特别是 XSD 1.1
0赞 pensee 8/19/2023
@YitzhakKhabinsky 非常感谢。XSD 比 RELAX NG 好吗?XSD是现在人们使用最多的一种吗?我猜 DTD 是最古老的一个
0赞 Yitzhak Khabinsky 8/19/2023
没错。XSD 1.1 统治着这一切。

答:

1赞 Michael Kay 8/19/2023 #1

架构(或 DTD)描述一类文档的共同特征。因此,从单个文档(尤其是仅包含三个元素的文档)推断架构涉及大量的猜测。想象一下,试图从一个非常简单的网页中制定出 HTML 的规范!您的问题中认为 XML 文档存在“正确的 DTD”的想法是完全错误的;如果只有一个文档,则有任意数量的正确 DTD。

特别是,当您从一个文档甚至一组文档推断架构或 DTD 时,结果通常要么过于精确(它排除了有效的东西:例如,它假设因为每个示例文档都有偶数个段落,那么这是一个必要的特征),要么不够精确(例如, 它无法发现数值属性必须始终小于 200)。一般来说,从一组有限的例子中制定出一般规则是不可能的。