Esquema XML: cuestiones de espacio de nombres al importar elementos compartidos
-
26-09-2019 - |
Pregunta
Al intentar importar definiciones compartidas de un esquema XML, que puede hacer referencia a tipos adecuadamente compartidos, pero hace referencia a los elementos compartidos provoca errores de validación.
Este es el esquema que importa las definiciones compartidas (example.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 son las definiciones compartidas (shared.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>
Ahora considere esta instancia 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>
Cuando validado, el "importedType" funciona perfectamente bien, pero el "importedElement" da el siguiente error:
se encontró contenido no válido a partir de elemento 'fooElement'. Uno de '{ " http://shared.com ": fooElement}' se espera
Me imagino que mis problemas están relacionados con problemas de espacio de nombres (de ahí el alguna manera engañosa "got fooElement pero esperaba fooElement") - ninguna pista sobre lo que está mal aquí
Solución
Está haciendo referencia a fooElement
como si fuera en ningún espacio de nombres, es necesario utilizar el espacio de nombres correcto en su documento de instancia:
<?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 debería haber señalado: que es la diferencia entre tipo y elementos ; Sólo estos últimos aparecen en los documentos (con algunas excepciones), por eso sus obras de tipo importados como lo hubiera querido, y su elemento no lo hace.