Pregunta

Estoy tratando de envolver mi cabeza alrededor de esquemas xml y una cosa que estoy tratando de averiguar es cómo hacer esquemas de tipo relacional donde el elemento se refiere a otro, posiblemente en otro esquema por completo. He visto xsd: key y xsd: keyref y parece que es el tipo de cosas que me interesan, pero no estoy seguro. Inicialmente acabo de establecer atributos con el tipo xs: ID abd xs: IDREF, que obviamente no se refiere necesariamente a un elemento específico por lo que pude ver.

Básicamente, tengo varios archivos xml diferentes donde los elementos se refieren a otros elementos, ya sea en el mismo archivo u otros archivos. Se parece mucho a una base de datos de relaciones y me encantaría usar una, pero el requisito es usar solo archivos XML, así que al menos estoy tratando de establecer la cordura de algo en lugar de cadenas aparentemente aleatorias Confiando en comentarios xml para definir las relaciones. Funciona para proyectos más pequeños, pero ciertamente no es escalable.

¿Alguna idea?

¿Fue útil?

Solución

No tengo conocimiento de nada dentro del Esquema XML que le permita validar varios documentos XML entre sí. En las restricciones xs: id y xs: key (etc.), utiliza xpath para aplicar las restricciones. Puede ir a Esquema XML Parte 1: Estructuras y desplazarse hacia abajo un poco para que el ejemplo vea estas restricciones en acción.

Si tiene la capacidad de definir un archivo meta-XML que incluya a sus otros (tal vez por referencias de entidad si no de otra manera) y luego usar un esquema para ese meta archivo, entonces debería poder usar el esquema XML para Aplica tus restricciones. Si define un esquema para cada uno de sus tipos de archivos XML, debería poder trivialmente ( xs: import o xs: include ) definir un meta-esquema para un Archivo XML que incluye todo su contenido XML en un archivo XML. Este meta-esquema podría aplicar con éxito las restricciones que desee.

Digamos que tiene que validar un Wiki que tiene muchas publicaciones, donde cada publicación tiene un autor y tal vez muchos comentarios donde cada comentario también tiene un autor, y que tiene un archivo XML para todas las publicaciones, uno para todos los comentarios, una para todos los autores, y desea validar las restricciones entre estos archivos, que cada publicación use los autores y los comentarios que existen, que cada comentario use los autores que existen, y así sucesivamente. Digamos que tiene los siguientes tres archivos:

El archivo /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>

El archivo /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>

El archivo /home/username/authors.xml :

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

Lo que sugiero es que cree un archivo meta-XML utilizando Referencias de entidades . Por ejemplo, podría crear el siguiente archivo 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 archivo meta-XML (en realidad, un archivo XML antiguo simple ... el '' meta '' es solo desde la perspectiva de sus tres archivos XML definidos, y no en ningún sentido XML) es el equivalente exacto de lo siguiente y los analizadores XML actuarán como si realmente tuviera el siguiente archivo:

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

Desde este archivo, puede definir un esquema XML que aplique las restricciones deseadas, aunque con los archivos individuales no hay forma de aplicar restricciones. Desde que usó la notación de entidad XML, ha incluido ""; todo el XML en un solo archivo, puede utilizar xpath en las referencias de contraint.

Otros consejos

Si no recuerdo mal, xs: ID tiene que ser globalmente único en todo el documento, mientras que xs: key solo tiene que ser único para el elemento para el que fue definido Entonces la key / keyref es en realidad más como PK / FK. PK solo tiene que ser único dentro de una tabla.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top