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

#xml #dtd

#xml #dtd

Вопрос:

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

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

Ответ №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) >
  

Первое относится к ключевому слову content model ANY , но второе означает элемент с именем «ANY», и это скобки, которые вызывают это различие.

Комментарии:

1. Итак, ваш ответ заключается в том, что в DTD нет решения. Неужели нет никакого обходного пути?

2. @Spiderman Мой ответ таков: «на данный момент я не могу вспомнить ни одного способа сделать это с помощью DTD». Есть небольшая вероятность, что это возможно, но я так не думаю, и я не смог придумать никакого решения. 🙁 Обходной путь заключается в использовании чего-либо другого, кроме DTD, для проверки, если использование DTD не является обязательным.

3. в конце концов я перешел в XSD world и использовал <xs:any namespace=»##any» processContents=»skip»/> решение. Итак, спасибо

4. Для справки — нет, с DTD это невозможно сделать. Действительность DTD требует, чтобы были объявлены все элементы и атрибуты. ANY Ключевое слово — это удобный способ избежать любого наложения дополнительных ограничений, но не более того.