xml dtd — как избежать разбора содержимого элемента?

Среди элементов, из которых состоит мой xml, у меня есть элемент, назовем его «X», который может содержать множество различных внутренних элементов. Поэтому я хотел бы определить синтаксический анализатор DTD, чтобы избежать синтаксического анализа его содержимого во время проверки XML.
Я попытался определить этот элемент с помощью:
<!ELEMENT X ANY>
и получил сообщение об ошибке, что внутренний элемент внутри 'X' не определен, и при попытке определить его как:
<!ELEMENT X (#PCDATA)>
я получил сообщение об ошибке "Внутри "X" разрешен только текст

Как мне определить X, чтобы средство проверки DTD игнорировало содержимое элемента «X»?


person Spiderman    schedule 29.08.2010    source источник


Ответы (1)


Некоторые руководства в Интернете утверждают, что ANY означает завершение процесса проверки этого элемента, но это неверная информация. Модель содержимого ANY в DTD на самом деле не означает «разрешить любой правильно сформированный XML-контент в этом элементе». Вместо этого это означает «разрешить любое содержимое, определенное в этом DTD». Это означает, что вы получите ошибку для каждого элемента, модель контента которого вы не определили (или не можете определить). Концептуально это означает то же самое, что и невозможность разрешить содержимое из другого пространства имен.

К сожалению, на данный момент я не могу вспомнить, как это сделать с помощью DTD. Однако это возможно с XML-схемами:

<xs:complexType>
  <xs:sequence>
    <xs:any namespace="##any" processContents="skip"/>
  </xs:sequence>
</xs:complexType>

Это разрешит любые элементы из любого пространства имен и пропустит проверку для этого элемента. Если вы можете переключиться с DTD на XML-схемы, это решит вашу проблему.

Примечание о простой ошибке при использовании ANY
(Исходный постер не содержал этой ошибки, но я просто упомянул ее здесь, так как уже пишу на эту тему.)
Это это простая опечатка, но эти два не означают одно и то же:

<!ELEMENT X  ANY  >
<!ELEMENT X (ANY) >

Первый относится к ключевому слову модели контента ANY, а второй означает элемент с именем «ЛЮБОЙ», и именно круглые скобки вызывают эту разницу.

person jasso    schedule 29.08.2010
comment
Итак, ваш ответ заключается в том, что в DTD нет решения. Разве не может быть никакого обходного пути? - person Spiderman; 30.08.2010
comment
@Spiderman Мой ответ заключается в том, что на данный момент я не могу вспомнить, как сделать это с помощью DTD. Есть небольшой шанс, что это возможно, но я так не думаю и не смог найти никакого решения. :( Обходной путь — использовать для проверки что-то другое, кроме DTD, если использование DTD не является обязательным. - person jasso; 30.08.2010
comment
в конце концов я перешел в мир XSD и использовал решение ‹xs:any namespace=##any processContents=skip/›. Тогда спасибо - person Spiderman; 07.09.2010
comment
Для протокола - нет, с помощью DTD это сделать невозможно. Действительность DTD требует, чтобы все элементы и атрибуты были объявлены. Ключевое слово ANY — это удобный способ избежать наложения дополнительных ограничений, но не более того. - person C. M. Sperberg-McQueen; 21.08.2012