Реализация отношений типа внешнего ключа в схеме XSD

StackOverflow https://stackoverflow.com/questions/614700

Вопрос

Я пытаюсь обернуть голову вокруг XML-схем, и одну вещь, которую я пытаюсь выяснить, - это как создавать схемы реляционных типов, где элемент ссылается на другую, возможно, в другой схеме вообще. Я посмотрел на xsd: key и xsd: keyref, и это похоже на то, что меня интересует, но я не уверен. Первоначально я просто устанавливал атрибуты с типом xs: ID abd xs: IDREF, который, очевидно, не обязательно ссылается на конкретный элемент, насколько я могу судить.

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

Есть мысли?

Это было полезно?

Решение

Я не знаю ничего внутри XML-схемы, которая позволила бы вам проверять несколько XML-документов друг против друга. В ограничениях xs: id и xs: key (и т. Д.) Вы применяете xpath для применения ограничений. Вы можете перейти в XML-схему, часть 1: структуры и прокрутить вниз немного для примера, чтобы увидеть эти ограничения в действии.

Если у вас есть возможность определить файл мета-XML, который включает ваши другие файлы (возможно, по ссылкам на сущности, если никаким другим способом), а затем использовать схему для этого метафайла, то вы сможете использовать схему XML для применить свои ограничения. Если вы определяете схему для каждого из ваших типов файлов XML, вы должны иметь возможность тривиально (с помощью xs: import или xs: include ) определить мета-схему для XML-файл, который включает в себя весь ваш XML-контент в одном XML-файле. Эта мета-схема может успешно применять требуемые ограничения.

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

Файл /home/username/posts.xml :

<?xml version="1.0" encoding="UTF-8" ?>
<posts>
  <post>
    <author name="author1"/>
    <comment id="12345" pos="1"/>
    <comment id="12346" pos="2"/>
    <body>I really like my camera...</body>
  </post>
   ...
</posts>

Файл /home/username/comments.xml :

<?xml version="1.0" encoding="UTF-8" ?>
<comments>
  <comment id="12345" author="kindguy">
    That was a very good post
  </comment>
   ...
</comments>

Файл /home/username/authors.xml :

<?xml version="1.0" encoding="UTF-8" ?>
<authors>
  <author name="kindguy" id="1"/>
  <author name="author1" id="2"/>
   ...
</authors>

Я предлагаю вам создать файл мета-XML с помощью ссылок на объекты . Например, вы можете создать следующий XML-файл:

<?xml version="1.0" encoding="UTF-8" ?>
<!ENTITY postfile    SYSTEM "file:///home/username/posts.xml">
<!ENTITY commentfile SYSTEM "file:///home/username/comments.xml">
<!ENTITY authorfile  SYSTEM "file:///home/username/authors.xml">
<root>
  &postfile1;
  &commentfile;
  &authorfile;
</root>

Этот файл мета-XML (на самом деле это простой старый XML-файл ... "meta" только с точки зрения ваших трех определенных XML-файлов, а не в каком-либо смысле XML) является точным эквивалентом следующего file, и анализаторы XML будут действовать так, как если бы у вас действительно был следующий файл:

<?xml version="1.0" encoding="UTF-8" ?>
<root>
  <posts>
    <post>
      <author name="author1"/>
      <comment id="12345" pos="1"/>
      <comment id="12346" pos="2"/>
      <body>I really like my camera...</body>
    </post>
     ...
  </posts>
  <comments>
    <comment id="12345" author="kindguy">
      That was a very good post
    </comment>
     ...
  </comments>
  <authors>
    <author name="kindguy" id="1"/>
    <author name="author1" id="2"/>
     ...
  </authors>
</root>

В этом файле вы можете определить схему XML, которая будет применять желаемые ограничения, даже если для отдельных файлов нет способа применить ограничения. Поскольку вы используете нотацию сущностей XML, вы включили " все XML в один файл, вы можете использовать xpath в ссылках на противопоказания.

Другие советы

Эта проблема обсуждается в http: // www .w3.org / TR / 2004 / REC-xmlschema-1-20041028 / структуры.html примечание, раздел 3.11.

Если я правильно помню, xs: ID должен быть глобально уникальным для всего документа, тогда как xs: key должен быть уникальным только для элемента, для которого он был определены. Таким образом, key / keyref на самом деле больше похож на PK / FK. PK должен быть уникальным только в одной таблице.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top