Pergunta

Eu estou tentando envolver minha cabeça em torno de esquemas XML e uma coisa que estou tentando descobrir é como fazer esquemas do tipo relacional, onde no elemento refere-se a um outro, possivelmente em outro esquema completamente. Eu olhei para o xsd: key e xsd: keyref e parece que o tipo de coisa que me interessa, mas eu não tenho certeza. Inicialmente eu acabamos de atributos com os tipo xs: xs ID abd:. IDREF, o que obviamente não se refere necessariamente a um elemento específico, tanto quanto eu poderia dizer

Basicamente, eu tenho vários arquivos XML diferentes onde os elementos se referem a outros elementos, quer no mesmo arquivo ou outros arquivos. Ele se parece muito com um banco de dados relação e eu gostaria de usar um, mas a exigência é apenas arquivos uso de XML e assim que eu sou, pelo menos, tentar estabelecer alguns sanidade em vez de cordas apenas aparentemente aleatórios contando com comentários XML para definir as relações. Ele funciona para projetos menores, mas certamente não é escalável.

Qualquer pensamento?

Foi útil?

Solução

Eu não estou ciente de qualquer coisa dentro de XML Schema que permitirá que você para validar vários documentos XML contra o outro. No xs:id e xs:key (etc) restrições, você usa XPath para aplicar as restrições. Você pode ir para XML Schema Parte 1: Estruturas e role para baixo a pouco para o exemplo para ver essas restrições em ação.

Se você tem a capacidade de definir um arquivo de meta-XML que inclui os outros (talvez por referências de entidade, se por nenhuma outra maneira) e, em seguida, usar um esquema para esse arquivo meta, então você deve ser capaz de usar XML Schema para aplicar as restrições. Se você definir um esquema para cada um dos tipos de arquivo XML, você deve ser capaz de trivialmente (por xs:import ou xs:include) definir uma meta-esquema para um arquivo XML que inclui todo o seu conteúdo XML em um arquivo XML. Esta meta-esquema poderia aplicar com sucesso as restrições que você deseja.

Vamos dizer que você tem que validar um Wiki que tem muitos posts, onde cada post tem um autor e talvez muitos comentários onde cada comentário tem também um autor, e que você tem um arquivo XML para todos os lugares, um para todos os comentários, uma para todos os autores, e você quer restrições Validar entre esses arquivos, que cada post usos autores e comentários que existem, que cada comentário usos autores que existem, e assim por diante. Vamos dizer que você tem os seguintes três arquivos:

O /home/username/posts.xml arquivo:

<?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>

O /home/username/comments.xml arquivo:

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

O /home/username/authors.xml arquivo:

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

O que estou sugerindo é que você faça um arquivo de meta-XML usando Entidade Referências . Por exemplo, você pode criar o seguinte arquivo 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>

Este arquivo meta-XML (na verdade, um arquivo XML simples velho ... a "meta" é apenas a partir da perspectiva de seus três arquivos XML definidos, e não em qualquer sentido XML) é o equivalente exato do seguinte arquivo e analisadores XML vai agir como se você realmente teve o seguinte arquivo:

<?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>

De este , você pode definir um esquema XML que irá aplicar as restrições desejadas, mesmo com os arquivos individuais não há nenhuma maneira de aplicar restrições. Desde usando entidade XML notação de ter "incluído" todo o XML em um arquivo, você pode usar XPath nas referências contraint.

Outras dicas

Se bem me lembro, xs:ID tem que ser globalmente únicos dentro do documento todo, enquanto xs:key só tem de ser exclusivo para o elemento para o qual foi definido. Assim, o key/keyref é realmente mais como PK / FK. PK só tem que ser único dentro de uma tabela.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top