Pergunta

Eu estou tentando XML uso Inclui para ajudar a gerenciar uma grande estrutura XML que precisa ser utilizável por ambos os seres humanos e máquinas.

Mas estou experimentando uma miríade de problemas ao tentar construir arquivos XML que podem ser validados contra um esquema existente. Aqui está um exemplo simplificado do que estou tentando fazer.

Meu "main.xml" arquivo não 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>

O arquivo "child.xml" valida bem como um arquivo independente.

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

Aqui está o meu 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>

As minhas questões são quase obviamente relacionada com namespaces mas eu estou em uma perda para saber como resolver o meu problema.

Foi útil?

Solução

Como skaffman já salientado, XML Schema e XInclude não são compatíveis.

A mensagem de erro de validação de xmllint afirma isso 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 o W3C Recomendação: "XInclude define nenhuma relação com os InfoSets aumentada produzida pela aplicação de um esquema XML. tal infoset aumentada pode ser fornecido como o infoset entrada, ou tal aumento pode ser aplicado para o infoset resultante da inclusão ".

Assim, você deve primeiro construir todo o arquivo XML aplicando as XIncludes e validar este arquivo mais tarde.

Edit:. Você pode usar xmllint com --xinclude para validar main.xml

Outras dicas

Eu concordo com grantwparks - XInclude e XML Schema absolutamente podem ser usados ??juntos. As especificações são intencionalmente independentes um do outro. Aparentemente, os autores do XInclude queria dar a liberdade para deixar o inclui a ser processado antes de validação ou após a validação.

Este segmento em velocityreviews discute a questão ea resposta que me ajudou a entender o assunto era este post sobre xml.com , citando-o:

Um dos mais perguntas comuns sobre XInclude é como a inclusão interage com validação, transformação XSL, e outros processos que pode ser aplicado a um documento XML. A resposta curta é que ele não. XInclusion não é parte de qualquer outro processo XML. É um passo separado, que você pode ou não pode executar quando e onde é útil.

Por exemplo, considere a validação contra um esquema. Um documento pode ser validados antes da inclusão, após a inclusão, ou ambos. Se você validar o documento antes da XI: incluir elementos são substituídos, então o esquema tem de declarar a xi: incluir elementos apenas como ela seria declarar qualquer outro elemento. Se você validar o documento após a xi: incluir elementos são substituídos, em seguida, o esquema tem de declarar a elementos de reposição. A inclusão e a validação são separados, ortogonais processos que podem ser realizados em qualquer ordem que seja conveniente no ambiente local

Então, o que parece resumir-se a, é fazer com que suas ferramentas XML para processar a xi: incluir elementos antes da validação (que é o que o exemplo das necessidades OP). Por exemplo, no XML editor do Eclipse, há uma configuração "Inclusões XML processo" sob XML -> Arquivos XML -> Validação (usando RSA 8,5), que precisa ser ligado para obter o editor para xi processo: incluem antes validação.

Andy

Eu não acho que o XML Schema e especificações XInclude são garantidos para ser compatível com o outro. processadores XML individuais pode permitir isso, mas outros não.

Como regra geral, eu diria que os dois não devem ser usados ??juntos.

P.S. Eu não sei por que você acha que isso é um problema namespace. O que lhe dá essa impressão?

Eu não acho que isso é causado por uma incompatibilidade entre XInclude e esquema; parece-me que o incluem não está a ser processada antes da validação. Assim, o esquema não permitem uma "incluir" elemento principal apenas um elemento, "criança". Se você pode forçar seu processador XML para processo inclui antes da validação ...

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