Frage zu Namespace in XML Datei

DarthShader

Erfahrenes Mitglied
Hallo,

ich komme gerade ziemlich bei dem Thema Namespaces durcheinander und hätte da eine, wahrscheinlich einfach zu beantwortende Frage.

Ich habe folgendes einfaches XML Schema erstellt:


XML:
<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema
	xmlns="http://www.test.de/schema/TopicBasedDocument"
	xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
	targetNamespace="http://www.test.de/schema/TopicBasedDocument">
	
	<xsd:complexType name="Topic">
    	<xsd:sequence minOccurs="1" maxOccurs="1">
    		<xsd:element name="title" type="xsd:string" />
    		<xsd:element name="icon" type="xsd:string" minOccurs="0" />
    	</xsd:sequence>
    	<xsd:attribute name="id" type="xsd:string" />
    </xsd:complexType>
    
    <xsd:complexType name="TopicSet">
    	<xsd:sequence minOccurs="1" maxOccurs="unbounded">
    		<xsd:element name="topic" type="Topic" />
    	</xsd:sequence>
    	<xsd:attribute name="id" type="xsd:string" />
    </xsd:complexType>
	
	<!-- =========
	     Elements 
	     ========= -->

	<xsd:element name="TopicBasedDocument">
		<xsd:complexType>
			<xsd:sequence minOccurs="1" maxOccurs="unbounded">
				<xsd:element name="topicRoot" type="TopicSet" />
			</xsd:sequence>
		</xsd:complexType>
	</xsd:element>

</xsd:schema>


Nun lasse ich mir eine XML Datei daraus generieren, die so aussieht:

XML:
<?xml version="1.0" encoding="UTF-8"?>
<p:TopicBasedDocument 
	xmlns:p="http://www.test.de/schema/TopicBasedDocument" 
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
	xsi:schemaLocation="
		http://www.test.de/schema/TopicBasedDocument
		test.xsd" >
  
  <topicRoot>
    <topic>
      <title>title</title>
    </topic>
  </topicRoot>

</p:TopicBasedDocument>


Meine Frage ist nun, warum muss ich den Namespace "p" angeben? Wenn ich "p" weglasse ("xmlns: p" sowie auch das "p:" beim "TopicBasedDocument" Tag), dann validiert das XML nicht, es erscheint folgender Fehler bei "<topicRoot>":

cvc-complex-type.2.4.a: Invalid content was found starting with
element 'topicRoot'. One of '{topicRoot}' is expected.


Kann mir das jemand erklären?


Vielen Dank für Eure Hilfe!
 
Zuletzt bearbeitet von einem Moderator:

deepthroat

Erfahrenes Mitglied
Hi.

Die Einstellung für elementFormDefault ist "unqualified". Dabei werden lokale Elemente nicht dem Ziel-Namensraum zugewiesen.

Wenn du im Instanzdokument einen Standard-Namensraum angibst, werden alle unqualifizierten Elemente (also ohne Namensraum-Präfix) diesem Standard-Namensraum zugeordnet.

Der Fehler rührt also daher, dass unterhalb von TopicBasedDocument (im Namensraum "http://www.test.de/schema/TopicBasedDocument") ein topicRoot Element (ohne Namensraum) erwartet wurde und kein topicRoot Element im Namensraum "http://www.test.de/schema/TopicBasedDocument".

Du könntest die elementFormDefault Einstellung auf "qualified" setzen. Siehe z.B. http://www.w3.org/TR/xmlschema-0/#QualLocals

Oder du definierst alle deine Elemente global, so das diese auch dem Zielnamensraum zugeordnet werden. Siehe z.B. http://www.w3.org/TR/xmlschema-0/#GlobalvsLocal

Gruß