Остановить узел, содержащий подузлы и текст в схеме - PullRequest
0 голосов
/ 02 апреля 2010

Если у меня есть xml вроде этого:

<mynode>
    <mysubnode>
        <mysubsubnode>hello world</mysubsubnode>
        some more text
    </mysubnode>
</mynode>

Как видите, mysubnode содержит подузел и некоторые текстовые данные.

Что я хочу знать, так это: можно ли предотвратить это в схеме? Я не хочу, чтобы узлы содержали подузлы и текст, просто подузлы или текст.

Есть ли в моем xsd параметр, который я могу указать для принудительного вызова?

Моя программа, использующая этот xml, написана на .NET, поэтому я также помечу ее, если в .net есть что-то полезное, что я могу использовать для этого, хотя я бы предпочел, чтобы проблема была исправлена. в самой схеме.

Приветствия

1 Ответ

1 голос
/ 02 апреля 2010

Edit: при перечитывании вопроса OP ожидает использовать XSD, а не DTD (что кстати хорошо!). Я изначально, хотя, что DTD был запрошен; вот версия XML Schema (XSD)

<?xml version="1.0" encoding="ISO-8859-1" ?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">

  <xs:complexType name="mysubnodetype" mixed="false">
    <xs:sequence>
      <xs:element name="mysubsubnode" type="xs:string"/>
    </xs:sequence>
  </xs:complexType>

  <xs:complexType name="mynodeType" mixed="false">
    <xs:sequence>
      <xs:element name="mysubnode" type="mysubnodetype"/>
    </xs:sequence>
  </xs:complexType>

  <xs:element name="mynodeType" type="mynodeType"/>
</xs:schema>

Примечания: атрибут mixed="false", добавленный к complexTypes, является избыточным, поскольку по умолчанию смешанный режим complexType имеет значение false (следовательно, по умолчанию предотвращает смешивание элементов и текста между элементами.)


(оригинальный ответ, вместо DTD)
Следующее DTD предотвратит это. Обратите внимание на тот факт, что mysubnode может содержать только sububnode, здесь нет ссылки на PCDATA w / r mysubnode, и поэтому «еще какой-то текст» фрагмента XML в вопросе будет недействительным.

<!ELEMENT mynode (mysubnode)>
<!ELEMENT mysubnode  (mysubsubnode)>
<!ELEMENT mysubsubnode (#PCDATA)>

Чтобы сделать XML-код вопроса верным, понадобится что-то вроде этого

<!ELEMENT mynode (mysubnode)>
<!ELEMENT mysubnode   (#PCDATAT | mysubsubnode)>
<!ELEMENT mysubsubnode (#PCDATA)>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...