xml: возможно ли многоуровневое использование ENTITY? - PullRequest
1 голос
/ 27 апреля 2009

Мы используем XML для определения схемы для управления содержимым, которое может отображаться в инструменте построения диаграмм. Файл схемы определяет, какие виды объектов могут быть размещены на диаграмме, как они могут быть связаны друг с другом и какие свойства имеют эти объекты (то есть какие настраиваемые свойства применяются в редакторе).

Когда требуется диаграмма нового типа, пишется новая схема и проверяется на соответствие .xsd. Чтобы сделать файл схемы более модульным и более простым в обслуживании, мы используем объявления для включения отдельных файлов. Списки свойств и т. Д., Которые принадлежат определенному элементу диаграммы, но могут иметь место в нескольких местах схемы, записываются в отдельный XML-файл и затем включаются в соответствующее место. Скажи:

<!-- Nameing etc. just as an example -->
<!ENTITY CommonProerties1 SYSTEM "file:../CommonProperties1.xml">
<!ENTITY CommonProerties2 SYSTEM "file:../CommonProperties2.xml">

и затем где-нибудь в схеме:

<Node shape="Square">
    &CommonProperties1;
    <!-- Specific properties go here -->
</Node>

Это предотвращает большое количество копируемых материалов, что затрудняет обслуживание, и позволяет совместно использовать свойства commmpn с несколькими схемами.

Проблема в том, что теперь некоторые из общих свойств также имеют базовые элементы, такие как группы флагов и перечислений и т. Д. Я хотел бы, чтобы каждый файл (например, «CommonProperties1.xml») мог включать из другого базовый набор, такой как "CommonEnums.xml", но я не думаю, что это возможно с помощью объявлений! ENTITY.

Вы не можете объявить! ENTITY за пределами заголовка! DOCTYPE, и если вы добавите заголовок, это сделает файл верхнего уровня недействительным, поскольку он получает объявление заголовка 1.2 через файл.

Кто-нибудь когда-нибудь пытался делать подобные вещи, и что вы делали, чтобы обойти / решить проблему? Есть ли лучший вариант, который мне не хватает?

Ура за любую помощь,

1019 * Xan *

1 Ответ

3 голосов
/ 05 мая 2009

Объекты общей системы были разработаны для использования в качестве механизма включения / замены текста. Я видел глубоко вложенные структуры с образцом огромной сложности.

Итак, давайте углубимся в формулировку вашей проблемы.

В вашем примере, почему вы думаете, что вы не можете иметь объявление! ENTITY для CommonEnums в объявлении типа документа, чтобы ссылка на сущность и CommonEnums были бы распознаны при разборе содержащейся сущности? Что особенного в этих системных объектах, о которых вам трудно объявить? Если ваша цель состоит в том, чтобы избежать необходимости объявлять их во время анализа пролога документа, то нет, вы не можете обойти это.

Вы не можете объявить! ENTITY вне! DOCTYPE заголовка

Это в некотором смысле верно, но есть полезная лазейка. Вы можете объявить общие сущности во внешнем DTD, и в этом случае их объявление физически не видно в прологе документа. Я не знаю, полезно ли это в вашей ситуации, но объявление ваших внешних общих системных объектов в DTD позволит вам «спрятать» их от экземпляров документов и фрагментов, которые к ним относятся.

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

...