XML Schema: Namespace Probleme beim gemeinsamen Elemente importieren
-
26-09-2019 - |
Frage
Beim Versuch, gemeinsamen Definitionen aus einem XML-Schema zu importieren, kann ich richtig geteilt Typen verweisen, aber gemeinsam genutzte Elemente verweisen verursacht Validierungsfehler.
Dies ist das Schema, dass die Einfuhren der gemeinsamen Definitionen (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>
Dies sind die gemeinsamen Definitionen (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>
Sie nun diese XML-Instanz betrachten:
<?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>
Wenn validiert, die „importedType“ arbeitet völlig in Ordnung, aber das „importedElement“ gibt die folgende Fehlermeldung:
ist ungültig Inhalt beginnend mit dem Element ‚fooElement‘ gefunden. Einer von '{ " http://shared.com ": fooElement}' erwartet wird,
Ich würde vermuten, dass meine Probleme zu Namespace-Fragen im Zusammenhang werden (daher der irgendwie irreführend „bekam fooElement aber erwartete fooElement“) - keine Hinweise auf das, was ist los hier
Lösung
Sie verweisen fooElement
, als ob es in keinem Namensraum war, müssen Sie den richtigen Namensraum in Ihrem Instanzdokument verwenden:
<?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>
Edit: Ich sollte darauf hingewiesen: dass die Unterschiede zwischen Typen ist und Elemente ; nur die letztere erscheint in Dokumenten (mit einigen Ausnahmen), das ist, warum Ihr importierter Typ funktioniert, wie man wollte, und Ihr Element nicht.