Esquema XML: Problemas de espaço para nome ao importar elementos compartilhados
-
26-09-2019 - |
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?
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.