XML Schema: problemi di spazio dei nomi durante l'importazione elementi condivisi
-
26-09-2019 - |
Domanda
Quando si cerca di importare definizioni condivise da un XML Schema, posso correttamente riferimento tipi condivisi, ma fa riferimento a elementi condivisi provoca errori di convalida.
Questo è lo schema che importa le definizioni condivise (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>
Queste sono le definizioni condivise (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>
Ora considerare questo esempio 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 convalidato, il "importedType" funziona perfettamente bene, ma il "importedElement" dà il seguente errore:
contenuto non valido è stato trovato a partire con l'elemento 'fooElement'. Uno dei '{ " http://shared.com ": fooElement}' è previsto
Direi che i miei problemi sono connessi alle questioni di spazio dei nomi (da qui il qualche modo fuorviante "ha ottenuto fooElement ma si aspettava fooElement") -? Eventuali suggerimenti su ciò che non va qui
Soluzione
si fa riferimento fooElement
come se fosse in nessun spazio dei nomi, è necessario utilizzare lo spazio dei nomi corretto nel documento di istanza:
<?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>
Modifica avrei fatto notare: questa è la differenza tra tipo e elementi ; solo queste ultime appaiono in documenti (con alcune eccezioni), è per questo che le vostre opere di tipo importati come si voleva, e il vostro elemento non lo fa.