Возможно ли в XML использование нескольких уровней !ENTITY?

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

Когда требуется новый тип схемы, записывается новая схема, которая проверяется на соответствие с XSD. Чтобы сделать файл схемы более модульным и простым в обслуживании, мы используем объявления <!ENTITY> для включения отдельных файлов. Списки свойств и т. д., которые относятся к определенному элементу диаграммы, но могут появляться в нескольких местах схемы, записываются в отдельный 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>

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

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

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

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


person xan    schedule 27.04.2009    source источник


Ответы (1)


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

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

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

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

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

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

person kmcorbett    schedule 05.05.2009
comment
Невозможно сделать то, на что мы надеялись, спасибо за совет. - person xan; 02.06.2010