Thomas J.S.: Namespace Attribut

Beitrag lesen

Hallo Romy,

Soweit ich es verstanden habe, kann man jedem Element in einem XML-Dokument ein Namespaceattribut mitgeben, man macht das aber eigentlich nur im Wurzelelement:

Man macht es oft nur im Wurzelelement, weil: "Die Namensraum-Deklaration gilt für das Element, in dem sie angegeben ist, und für alle Elemente im Inhalt dieses Elements[...]". Damit erschlägt man mehrere Fliegen auf einmal.
Aber es ist weder notwendig, noch immer gewünscht/möglich so zu machen.
Also sind Sachen wie folgt ist auch nicht unüblich:

<bk:book xmlns:bk="urn:loc.gov:books" xmlns:isbn="urn:ISBN:0-395-36341-6">
    bk:titleCheaper by the Dozen</bk:title>
    isbn:number1568491379</isbn:number>
    <html:a xmlns:html="http://www.w3.org/TR/REC-html40">Link to Book</html:a>
   <edifact:message
   xmlns:edifact="http://www.xml-edifact.org/LIB/xml-edifact-03/edifact.rdf"
   xmlns:tred="http://www.xml-edifact.org/LIB/xml-edifact-03/tred.rdf"
   xmlns:uncl="http://www.xml-edifact.org/LIB/xml-edifact-03/uncl.rdf">
  <tred:item.number.type.coded uncl:code="7143:IB">ISBN (International Standard Book Number)</tred:item.number.type.coded>
</edifact:message>
</bk:book>

Bsp:
<BlubberElement xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="blubber.xsd">

Ich habe nicht herausfinden können, was mir das jetzt nützt.
Es ist mir soweit klar, dass der Namespace irgendwie sicherstellen soll, dass ich keine geschützten oder schon verwendeten Begriffe verwende. Aber gegen was prüft er das? Gegen das Schema im Internet? Was passiert dann bei einer lokalen Prüfung.

Desweiteren ist mir nicht klar, warum ich die XSD mitgeben sollte.
Wie soll er die denn finden, da müsste ja irgendwie ien Pfad hin. Oder macht das nur Sinn, wenn der Pfad online ist und die XSD online steht? Aber dann ist da ja wieder das lokale Problem.

Brauche ich diese Angaben überhaupt? Sind sie sinnvoll?

Du verwechselst hier Namensräume mit Validerung von XML-Dokumenten.
Das »<BlubberElement xmlns:xsd="http://www.w3.org/2001/XMLSchema"« ist irreführend, weil "xsd" per Konvention für Elemente aus dem XML Schema Namensraum verwendet wird.
Also nehmen wir:
<BlubberElement xmlns="http://www.example.org/Blubber" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="blubber.xsd"> [*]

oder auch so etwas wäre möglich:
<romy:BlubberElement xmlns:romy="http://www.example.org/romy" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="blubber.xsd"> [**]

Also es ist eine Sache die Namensraumdeklarion zu machen.
Die andere ist das Verweisen auf eine Schema-Deklaration:
"In einem Instanzdokument [das wäre also die XML-Datei in der dein BlubberElement steht] bietet das Attribut schemaLocation Hinweise des Autors an einen Schema-Prozessor hinsichtlich der Lokation des Schema-Dokuments. Der Autor garantiert, dass diese Schema-Dokumente für eine Gültigkeitsprüfung des Dokumentinhalts auf Basis von Namensräumen relevant sind."

Das »xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"« brucht man, damit man dann entweder ein »xsi:schemaLocation« oder ein »xsi:noNamespaceSchemaLocation« Arttribut verwenden kann.

"Ein Schema muss keinen Namensraum haben, und deshalb gibt es ein noNamespaceSchemaLocation-Attribut, das verwendet wird, um einen Hinweis auf die Lokation von Schema-Dokumenten ohne Ziel-Namensraum zu geben."

Das heisst in dem Fall: im Schema kannst du deine elemente und Attribute deklarieren, ohne dass du dafür einen Namensraum(präfix) angebenmusst.
[* und **] Und danach wäre das XML-Element von oben so korrekt:
<BlubberElement xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="blubber.xsd">

Verwendet man einen Namensraum, muss man auch xsi:SchemaLocation verwenden.
<BlubberElement xmlns="http://www.example.org/Blubber" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.example.com/Blubber http://www.example.com/blubber.xsd">

Das ist also das Eine. Das andere ist wozu man Schemas verwendet. Betrachtest du sie als "DTD" wird das auch schon klar. Sie dienen dazu, dass ein XML, das das Schema verwendet (also ein  Instantzdokument) auf die Einhaltung der Regel, die im Schema definiert sind, überprüft werden kann.

Grüße
Thomas