Pregunta

Estoy intentando utilizar XML Incluye para ayudar a administrar una estructura XML grande que debe ser utilizable tanto por humanos como por máquinas.

Pero estoy experimentando una gran cantidad de problemas al intentar construir archivos XML que puedan validarse con un esquema existente.Aquí hay un ejemplo simplificado de lo que estoy tratando de hacer.

Mi archivo "main.xml" no se valida.

<?xml version="1.0" encoding="UTF-8"?>
<!-- Main.xml - This fails to validate. -->
<ns1:main xsi:schemaLocation="http://www.example.com/main main.xsd"
          xmlns:ns1="http://www.example.com/main"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xmlns:xi="http://www.w3.org/2001/XInclude">

    <name>String</name>
    <xi:include href="child.xml"/> <!-- What I'm trying to do. -->

</ns1:main>

El archivo "child.xml" se valida correctamente como archivo independiente.

<?xml version="1.0" encoding="UTF-8"?>
<!-- Child.xml - This validates fine, as a standalone file. -->
<ns1:child xsi:schemaLocation="http://www.example.com/main main.xsd"
           xmlns:ns1="http://www.example.com/main"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

    <name>String</name>
    <age>String</age>

 </ns1:child>

Aquí está mi esquema:

 <?xml version="1.0" encoding="UTF-8"?>
 <!-- Main.xsd - My Simplified Schema -->
 <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
            xmlns:ns1="http://www.example.com/main"
            targetNamespace="http://www.example.com/main">

    <!-- Main Element (References Child) -->
    <xs:element name="main">
         <xs:complexType>
             <xs:sequence>
                 <xs:element name="name" type="xs:string"/>
                 <xs:element ref="ns1:child"/>
             </xs:sequence>
         </xs:complexType>
    </xs:element>

    <!-- Child Element -->
    <xs:element name="child">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="name" type="xs:string"/>
                <xs:element name="age" type="xs:string"/>
            </xs:sequence>
        </xs:complexType>
     </xs:element>

</xs:schema>

Mis problemas están casi obviamente relacionados con los espacios de nombres, pero no sé cómo solucionarlo.

¿Fue útil?

Solución

skaffman ya se ha señalado, el esquema XML y XInclude no son compatibles.

El mensaje de error de validación de xmllint estados claramente:

main.xml:9: element include: Schemas validity error : Element  '{http://www.w3.org/2001/XInclude}include': This element is not expected. Expected is ( {http://www.example.com/main}child ).
main.xml fails to validate

Para citar el W3C Recomendación : "XInclude no define ninguna relación con los conjuntos de información aumentados producidos por la aplicación de un esquema XML. tal conjunto de información aumentada puede ser suministrado como el conjunto de información de entrada, o tal aumento podría ser aplicado al conjunto de información que resulta de la inclusión ".

Por lo tanto usted debe construir primero todo el archivo XML mediante la aplicación de las sentencias XInclude, y validar este archivo después.

Editar:. Usted puede utilizar xmllint con --xinclude para validar main.xml

Otros consejos

Estoy de acuerdo con Grantwparks: XInclude y XML Schema se pueden usar juntos.Las especificaciones son intencionadamente independientes entre sí.Aparentemente, los autores de XInclude querían brindar la libertad de permitir que las inclusiones se procesen antes o después de la validación.

Este hilo sobre revisiones de velocidad analiza el tema y la respuesta que me ayudó a entender el asunto fue esta publicación en xml.com, citándolo:

Una de las preguntas más comunes sobre Xinclude es cómo la inclusión interactúa con la validación, la transformación XSL y otros procesos que pueden aplicarse a un documento XML.La respuesta corta es que no lo hace.XInclusion no forma parte de ningún otro proceso XML.Es un paso separado que puede o no realizar cuando y donde sea útil para usted.

Por ejemplo, considere la validación con respecto a un esquema.Un documento puede validarse antes de la inclusión, después de la inclusión o ambos.Si valida el documento antes de que se reemplacen los elementos XI: incluir, entonces el esquema tiene que declarar el XI: incluir elementos como lo declararía cualquier otro elemento.Si valida el documento después de que se reemplazan los elementos XI: incluir, entonces el esquema debe declarar los elementos de reemplazo.La inclusión y la validación son procesos ortogonales separados que se pueden realizar en cualquier orden que sea conveniente en el entorno local

Entonces, todo parece reducirse a hacer que sus herramientas XML procesen los elementos xi:include antes de la validación (eso es lo que necesita el ejemplo del OP).Por ejemplo, en el editor XML de Eclipse, hay una configuración "Procesar inclusiones XML" en XML -> Archivos XML -> Validación (usando RSA 8.5), que debe activarse para que el editor procese xi:include antes validación.

andy

No creo que las especificaciones de esquema XML y XInclude están garantizados para ser compatibles entre sí. Los procesadores XML individuales podrían permitirlo, pero otros no.

Como regla general, yo diría que los dos no deben utilizarse juntos.

P.S. No estoy seguro de por qué cree que este es un problema de espacio de nombres. Lo que le da esa impresión?

No creo que esto es causado por una incompatibilidad entre XInclude y el esquema; parece a mí como el include no está siendo procesada antes de la validación. Así, el esquema no permite un elemento "incluir" sólo en un elemento principal, "niño". Si se pudiera obligar a su procesador de XML para proceso incluye antes de la validación ...

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