# [XSD] Namespace



## Thomas D (9. Mai 2007)

Hallo!

Ich bin ein wenig verwirrt, wie ich die Namespace-Angaben zu tätigen habe. Der Code schaut wie folgt aus:

XML:

```
<?xml version="1.0" encoding="UTF-8"?>
<wurzel xmlns="wurzel"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.w3.org/2001/XMLSchema-instance Kartenschema.xsd">
...
</wurzel>
```

XSD:

```
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:element name="wurzel">
        <xs:complexType>
            <xs:sequence>
                 ...
            </xs:sequence>
        </xs:complexType>
    </xs:element>
</xs:schema>
```

Das XSD-Dokument ist soweit mal gültig (mit oXygen überprüft). Beim Parsen des XML-Files bekomme ich die Fehlermeldung "Cannot find the declaration of element 'wurzel'". Was mache ich falsch - wie erziele ich den Zusammenhang zwischen dem Schema-Element 'wurzel' und dem in XML? Und wozu braucht man überhaupt diese Namespaces? Für jeden Hinweis dankbar  ...

MfG, Thomas D.


----------



## zerix (9. Mai 2007)

Hallo,

es gibt ja den Typ string bei Schemas, jetzt stell dir vor du willst auch einen Typ string machen. Dann hättest du ein Problem, weil du 2 Typen hättest, die gleich den gleichen Namen haben. Darum gibt es den Namespace. Da kannst du sagen, dieser Typ gehört zu dem Namensraum und der Typ gehört zu dem Namensraum und schon hast du keine Probleme mehr. 

Wenn du bei deinem XML-File auf deine Elemente zugreifen willst, musst du xsi davor schreiben, weil du den Namesraum so benannt hast.
Wenn du das so machst, musst du keinen Namesraum angeben

```
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:noNamespaceSchemaLocation="http://www.w3.org/2001/XMLSchema-instance Kartenschema.xsd"
```

Ich hoffe ich hab mich soweit klar ausgedrückt und konnte dir helfen.

MFG

zEriX


----------



## Thomas D (9. Mai 2007)

Mache ich das so, wie von dir vorgeschlagen, dann bekomme ich folgende Fehlermeldung:

_
SystemID: null
Beschreibung: schema_reference.4: Failed to read schema document 'http://www.w3.org/2001/XMLSchema-instance%20Kartenschema.xsd', because 1) could not find the document; 2) the document could not be read; 3) the root element of the document is not <xsd:schema>.
URL: http://www.w3.org/TR/xmlschema-1/#schema_reference
_

Das XML- und das XSD-Dokument befinden sich im selben Verzeichnis und auch das Rootelement ist, wie in meinem ersten Post gesehen, <xs:schema>. Was mache ich falsch


----------



## zerix (9. Mai 2007)

Dann lass man die URL weg.


```
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:noNamespaceSchemaLocation="Kartenschema.xsd"
```


----------



## Thomas D (9. Mai 2007)

*Invalid Content*

Dankesehr, das hat geholfen ;-)!

Jetzt habe ich allerdings einen neuen Kompilierfehler:

_
Invalid content was found starting with element 'ha'. One of '{text}' is expected.
_

Die XML schaut wie folgt aus (fett = hier tritt der Fehler auf):


```
<?xml version="1.0" encoding="UTF-8"?>
<wurzel xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:noNamespaceSchemaLocation="Kartenschema.xsd">
    <land id="Österreich" x="3" y="44" gfx="oesterreich">
        <ha>12</ha>
        <hl>12</hl>
...
```

Die XSD-Datei:


```
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:element name="wurzel">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="land">
                    <xs:complexType>
                        <xs:complexContent>
                            <xs:extension base="landRegionGebiet">
                                <xs:sequence>
                                    <xs:element name="regionen">
...
//und das ganze natürlich auch noch geschlossen

//Definition des Typs 'landRegionGebiet':

    <xs:complexType name="landRegionGebiet" abstract="true">
        <xs:complexContent>
            <xs:extension base="kartenobjekttype">
                <xs:sequence>
                    <xs:element name="ha" type="xs:positiveInteger" />
                    <xs:element name="hl" type="xs:positiveInteger" />
                    <xs:element name="reben" type="rebentype" />
                </xs:sequence>
            </xs:extension>
        </xs:complexContent>
    </xs:complexType>
    
    <xs:complexType name="kartenobjekttype" abstract="true">
        <xs:sequence>
            <xs:element name="text" type="xs:string" />
            <xs:element name="images" type="imagestype" />
        </xs:sequence>
        <xs:attribute name="id" type="xs:string" use="required" />
        <xs:attribute name="x" type="xs:nonNegativeInteger" use="required" />
        <xs:attribute name="y" type="xs:nonNegativeInteger" use="required" />
        <xs:attribute name="gfx" type="xs:string" use="optional" />
    </xs:complexType>
</xs:schema>
```

Ich bekomme diesen Fehler immer beim ersten Tag eines Elements vom Typ 'landRegionGebiete'. Was ist zu tun?

MfG, Thomas D.

BTW: Sorry, dass ich noch einmal nachfragen muss. Kenne mich in XML leider noch nicht wirklich aus und der Fehler sagt mir eigentlich gar nichts ...


----------



## zerix (9. Mai 2007)

Also ich würde einfach mal behaupten, dass dein erstes Element "text" sein muss. Ich habe es jetzt nicht ausprobiert.
Ich würde sagen, dass du erst die Elemente von kartenobjekttype, dann von landregiongebiet usw verwenden musst.


----------



## Thomas D (10. Mai 2007)

*Thx, logisch ...*

Ah, logisch  ... Ich dachte, als ich "text" gelesen habe, dass er einen Datentyp - also so etwas wie String meint. Vielen Dank auf jeden Fall - obwohl die Frage natürlich nicht sehr schlau von mir war  ...

BTW: Gibt es eigentlich eine Möglichkeit, dass die Tags nicht in einer bestimmten Reihenfolge (also sequence) gesetzt werden müssen? Sprich: alle Elemente müssen vorkommen, die Reihenfolge ist jedoch egal. <all> funktioniert ja leider aufgrund der abstrakten Base-Types auch nicht. Wenn nicht, ist das natürlich auch kein großes Problem. Praktisch wär's aber  ...


----------

