根据DTD验证XML,其中元素以随机顺序出现

时间:2011-06-21 03:47:26

标签: xml dtd

<!ELEMENT myxml (first,second,third)>
<!ELEMENT first (#PCDATA)>
<!ELEMENT second (#PCDATA)>
<!ELEMENT third (#PCDATA)>

上面的DTD将子元素(第一个,第二个和第三个)限制在XML中的顺序相同。有没有办法让这个DTD可以对XML进行验证,其中元素是强制性的,但可以按任何顺序出现?

3 个答案:

答案 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)>

基本上我只指定了一个firstsecondthird元素的每种可能组合。

这是一个示例实例。 firstsecondthird可以按任何顺序排列,但每次都必须出现一次。

<!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的功能之一。