<!ELEMENT myxml (first,second,third)>
<!ELEMENT first (#PCDATA)>
<!ELEMENT second (#PCDATA)>
<!ELEMENT third (#PCDATA)>
上面的DTD将子元素(第一个,第二个和第三个)限制在XML中的顺序相同。有没有办法让这个DTD可以对XML进行验证,其中元素是强制性的,但可以按任何顺序出现?
答案 0 :(得分:2)
当您需要每个子元素中的一个时,这很棘手。这是我能想到的唯一方式,而且不是很漂亮。它虽然有效......
<!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>
答案 1 :(得分:0)
<!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 :(得分:0)
在XML DTD中,没有优雅的方法来指定此约束。你可以像@DevNull建议那样做;这是合法的,但是当元素数量很大时,这种技术会变得难以处理。
如果这是关于SGML DTD的,那么您可以使用&
(AND) connector。但这是创建XML时removed的功能之一。