【发布时间】:2011-06-22 02:51:04
【问题描述】:
<!ELEMENT myxml (first,second,third)>
<!ELEMENT first (#PCDATA)>
<!ELEMENT second (#PCDATA)>
<!ELEMENT third (#PCDATA)>
上面的 DTD 限制子元素(第一、第二和第三)在 XML 中的顺序相同。有没有什么方法可以让这个 DTD 验证 XML 中的元素是强制性的,但可以以任何顺序出现?
【问题讨论】:
<!ELEMENT myxml (first,second,third)>
<!ELEMENT first (#PCDATA)>
<!ELEMENT second (#PCDATA)>
<!ELEMENT third (#PCDATA)>
上面的 DTD 限制子元素(第一、第二和第三)在 XML 中的顺序相同。有没有什么方法可以让这个 DTD 验证 XML 中的元素是强制性的,但可以以任何顺序出现?
【问题讨论】:
当您需要每个子元素中的一个时,这很棘手。这是我能想到的唯一方法,它不是很漂亮。它虽然有效......
<!ELEMENT myxml (
(first,second,third)|
(first,third,second)|
(second,first,third)|
(second,third,first)|
(third,first,second)|
(third,second,first)
)>
<!ELEMENT first (#PCDATA)>
<!ELEMENT second (#PCDATA)>
<!ELEMENT third (#PCDATA)>
基本上,我指定了一个 first、second 和 third 元素的所有可能组合。
这是一个示例。 first、second 和 third 可以按任意顺序排列,但它们都必须恰好出现一次。
<!DOCTYPE myxml [
<!ELEMENT myxml (
(first,second,third)|
(first,third,second)|
(second,first,third)|
(second,third,first)|
(third,first,second)|
(third,second,first)
)>
<!ELEMENT first (#PCDATA)>
<!ELEMENT second (#PCDATA)>
<!ELEMENT third (#PCDATA)>
]>
<myxml>
<third></third>
<first></first>
<second></second>
</myxml>
【讨论】:
<!ELEMENT myxml (first|second|third)*>
<!ELEMENT first (#PCDATA)>
<!ELEMENT second (#PCDATA)>
<!ELEMENT third (#PCDATA)>
不过,上述内容并不是很有用。您更有可能需要至少一个孩子,如下所示:
<!ELEMENT myxml (first|second|third)+>
<!ELEMENT first (#PCDATA)>
<!ELEMENT second (#PCDATA)>
<!ELEMENT third (#PCDATA)>
【讨论】:
+ 出现指示器的唯一问题是您指定了一个或多个子元素。这意味着您可以拥有类似 2 个 second 元素,仅此而已。我认为 OP 希望确保每个元素都存在并且只出现一次。
在 XML DTD 中,没有优雅的方式来指定这个约束。您可以按照@DevNull 的建议进行操作;这是合法的,但是当元素数量很大时,该技术变得笨拙。
如果这是关于 SGML DTD,那么您可以使用 & (AND) connector。但这是创建 XML 时 removed 的功能之一。
【讨论】: