Pergunta

Ao tentar importar definições compartilhadas de um esquema XML, posso referir corretamente tipos compartilhados, mas referenciar elementos compartilhados causa erros de validação.

Este é o esquema que importa as definições compartilhadas (exemplo.xsd):

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema
  elementFormDefault="qualified"
  xmlns:xs="http://www.w3.org/2001/XMLSchema"
  xmlns:shared="http://shared.com">

    <xs:import namespace="http://shared.com" schemaLocation="shared.xsd"/>

    <xs:element name="example">
        <xs:complexType>
            <xs:sequence>
                <xs:element ref="importedElement"/>
                <xs:element ref="importedType"/>
            </xs:sequence>
        </xs:complexType>
    </xs:element>

    <xs:element name="importedElement">
        <xs:complexType>
            <xs:sequence>
                <xs:element ref="shared:fooElement"/>
            </xs:sequence>
        </xs:complexType>
    </xs:element>

    <xs:element name="importedType">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="bar" type="shared:barType"/>
            </xs:sequence>
        </xs:complexType>
    </xs:element>

</xs:schema>

Estas são as definições compartilhadas (compartilhado.xsd):

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    xmlns="http://shared.com"
    targetNamespace="http://shared.com">

    <xs:element name="fooElement">
        <xs:simpleType>
            <xs:restriction base="xs:integer"/>
        </xs:simpleType>
    </xs:element>

    <xs:simpleType name="barType">
        <xs:restriction base="xs:integer"/>
    </xs:simpleType>

</xs:schema>

Agora considere esta instância XML:

<?xml version="1.0"?>
<example
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"                     
  xsi:noNamespaceSchemaLocation="example.xsd">
    <importedElement>
        <fooElement>42</fooElement>
    </importedElement>
    <importedType>
        <bar>42</bar>
    </importedType>
</example>

Quando validado, o "ImportedType" funciona perfeitamente bem, mas o "ImportedElement" dá o seguinte erro:

O conteúdo inválido foi encontrado começando com o elemento 'FooElement'. Um de '{"http://shared.com": FooElement} 'é esperado

Eu acho que meus problemas estão relacionados a problemas de namespace (daí o de alguma forma enganoso "Got FooElement, mas estava esperando o FooElement") - alguma dica sobre o que há de errado aqui?

Foi útil?

Solução

Você está referenciando fooElement Como se não estivesse em namespace, você precisa usar o espaço de nome correto no documento da instância:

<?xml version="1.0"?>
<example
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"                     
  xsi:noNamespaceSchemaLocation="example.xsd" xmlns:shared="http://shared.com">
    <importedElement>
        <shared:fooElement>42</shared:fooElement>
    </importedElement>
    <importedType>
        <bar>42</bar>
    </importedType>
</example>

Editar: Eu deveria ter apontado: essas são as diferenças entre tipos e elementos; Somente os últimos aparecem em documentos (com algumas exceções), é por isso que seu tipo importado funciona como você queria, e seu elemento não.

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