Проверка XML по DTD, в котором элементы появляются в случайном порядке - PullRequest
2 голосов
/ 21 июня 2011
<!ELEMENT myxml (first,second,third)>
<!ELEMENT first (#PCDATA)>
<!ELEMENT second (#PCDATA)>
<!ELEMENT third (#PCDATA)>

Приведенное выше DTD ограничивает дочерний элемент (первый, второй и третий) в XML в том же порядке. Есть ли способ, которым этот DTD может проверять XML, в котором элементы являются обязательными, но могут появляться в любом порядке?

Ответы [ 3 ]

2 голосов
/ 21 июня 2011

Это сложно, когда вам нужен ровно один из каждого дочернего элемента.Это единственный способ, которым я могу придумать, и он не очень красивый.Хотя это работает ...

<!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>
0 голосов
/ 21 июня 2011

В XML DTD нет элегантного способа указать это ограничение.Вы можете сделать так, как подсказывает @DevNull;это законно, но метод становится громоздким, когда количество элементов велико.

Если бы речь шла о DTD SGML, то вы могли бы использовать разъем & (AND) .Но это одна из функций, которые были удалены при создании XML.

0 голосов
/ 21 июня 2011
<!ELEMENT myxml (first|second|third)*>
<!ELEMENT first (#PCDATA)>
<!ELEMENT second (#PCDATA)>
<!ELEMENT third (#PCDATA)>

Выше не очень полезно, хотя.Вы, скорее всего, захотите потребовать хотя бы одного ребенка, например:

...