2013-10-08 8 views
5

Das folgende XML-Dokument und das Schema wurde von einem viel größeren Schema, in dem kocht das Problem zuerst aufgetreten:Warum wird der 'NULL-Namespace' für ein XML-Element erwartet, für das im Namespace ein Namespace definiert wurde?

Das Dokument xml:

<f2b:Foo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:f2b="http://www.outerfoospace.com/schemas/foo2bar" xsi:schemaLocation="http://www.outerfoospace.com/schemas/foo2bar f2b-0-0-0.xsd"> 
    <f2b:Bar>text</f2b:Bar> 
</f2b:Foo> 

Das Schema:

<?xml version="1.0" encoding="UTF-8"?> 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:f2b="http://www.outerfoospace.com/schemas/foo2bar" targetNamespace="http://www.outerfoospace.com/schemas/foo2bar"> 
    <xs:complexType name="T_Foo"> 
     <xs:sequence> 
      <xs:element name="Bar" xmlns="f2b"/> 
     </xs:sequence> 
    </xs:complexType> 
    <xs:element name="Foo" type="f2b:T_Foo"/> 
</xs:schema> 

Als ich validiere das Dokument gegen das Schema, bekomme ich eine Fehlermeldung auf dem <f2b:Bar> -Element, dass <f2b:Bar> nicht erwartet wird. Um das Dokument gültig zu machen, muss ich das <Bar> -Element explizit (!) In den 'Null-Namespace' setzen: <Bar xmlns="">. Ich sehe nicht, warum ein Null-Namespaced-Element erwartet werden sollte. Das Schema definiert einen Namensraum für alle Elemente und für das <Foo> -Element wird der f2b -Name-Bereich tatsächlich vom Validator erwartet. Aber selbst wenn ich den Namespace in der <Bar> -Element-Definition explizit wie oben gesetzt habe, erwartet der Validator immer noch xmlns="" für das Bar -Element. Ich habe verschiedene Varianten des Schemas und des Dokuments ausprobiert, um eine Antwort ohne Glück zu finden - und ich kann einfach nicht erraten, warum in diesem speziellen Fall der Null-Namespace erwartet wird.

Jeder Hinweis geschätzt ... ekke

Antwort

3

Kurze Antwort: add elementFormDefault="qualified" an die Wurzel xs:schema Tag Ihres Schemas.

Längere Antwort: Standardmäßig übernehmen nur globale Elementdeklarationen der obersten Ebene den Zielnamespace des Schemas. "Lokale" Elementdeklarationen innerhalb eines komplexen Typs befinden sich in keinem Namespace. Sie können dies für ein bestimmtes lokales Element überschreiben, indem Sie das form-Attribut für das xs:element-Tag oder global für alle Elemente verwenden, die elementFormDefault für das xs:schema verwenden.

+0

Danke für die klare Antwort - Sie haben vollkommen Recht. ekke – ekke