Thomas J.S.: Namespace Attribut

Beitrag lesen

Hallo Romy,

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."
Meine Frage dazu wäre, wenn ich dort blubber.xsd angebe, dann habe ich keine Angabe dabei, woe die liegt, damit dagegen validiert werden kann.

Doch natürlich!
Gibts du "xsi:noNamespaceSchemaLocation=blubber.xsd" an, wird ein Schema-validierender Parser genau im selben Verzeichnis nach einem blubber.xsd suchen, wo auch dein XML-Datei liegt.

Verwendest du xsi:schemaLocation, muss du sogar zwei Dinge angeben:
xsi:schemaLocation="http://www.example.com/Blubber http://www.example.com/blubber.xsd"

1. Den Namen des Namensraumes
2. Den URL der Schema-Datei. und dort wird der Parser dann auch danach suchen.

Im Zielsystem validiere ich damit indem ich dem Validierungstool sage, woe die XSD liegt. Warum also der Eintrag? Damit ich behaupten kann, ich hätte eine? :)

Nein, sondern damit jede Anwednung die es braucht nachprüfen kann, ob das XML gültig ist. Deinem Tool kannst du sagen, wo er nach einem Schema gucken soll, andere Tools greifen eben auf die xsi:schemaLocation zurück. Und damit es sichergestellt ist, dass bei Bedarf eine Überprüfung auch stattfinden kann, muss man die beiden angaben machen.

Das »xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"« braucht man, damit man dann entweder ein »xsi:schemaLocation« oder ein »xsi:noNamespaceSchemaLocation« Arttribut verwenden kann.
Okay, das brauche ich also nur, wenn ich die NamespaceShemaLocation- Angabe mache, lasse ich die weg, kann ich auch das weglassen, richtig?

Jein: du brauchst es, damit du Überhaput entweder ein »xsi:schemaLocation« oder ein »xsi:noNamespaceSchemaLocation« angeben kannst. Gibts du keine diese Attribute an, kannst du natürlich auf das »xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"« ganz verzichten. Denn in dem Fall verwendet dein XML ja gar kein Schema.

"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."
Verstehe ich richtig, dass es inkonsequent ist erst das Attribut xmlns:xsd="http://www.w3.org/2001/XMLSchema" anzugeben und dann noNameSpace zu sagen?

Vorsicht! Das »xmlns:xsd="http://www.w3.org/2001/XMLSchema"« hat eine ganz andere Bedeutung als andere Namensraumdeklarationen! Wie gesagt der Präfix "xsd" ist selbst für die XML-Schema Elemente gedacht.

Aber wenn du meinst z.B.:
<romy:BlubberElement xmlns:romy="http://www.example.org/Blubber"> und dann noch ein "xsi:noNamespaceSchemaLocation" dazugeben: ja, das ist inkonsequent und auch falsch.

Grundsatzfrage: Wofür brauche ich einen Namensraum?

Interessat ist es wenn du Daten mit anderen austauscht.
Du hast in deinem XML z.B. ein Element <preis>, jetzt tauschst du deine XMLs mit anderen aus. Sie haben in ihrem XML auch ein <preis>-Element.
Woher soll jetzt eine Anwendung wissen, ob er z.B. für die Ausgabe nun deinen <preis> oder das von den anderen nehmen soll.
Damit man eben nicht vollkommen irre wird und alles durcheinander bringt, wurde das Prinzip des Namensraumes erfunden. Damit kannst du deine Elemente eindeutig markieren.

»xmlns:romy="http//www.example.org/romy"«
Jetzt hast du einen eigene Namensraum (herzlichen Glückwunsch! ;-) ) und kannst du deine Elemente fortan romy:xxxxxx nennen.
Das schöne an der Sache ist: es muss nichts hinter der URL den man angibt stecken, in der Tat braucht der mal nicht zu existieren. Sie dient Lediglich der als eindeutige Identifikationsmerkmal.

Woran erkenne ich, dass ich einen verwende (am blubber:<elementname>? So wie bei den FOP-Zeug, wo immer fo: davor steht, jetzt mal in Kinderdeutsch?)

Genau!
Du erkennst es an zwei Dingen:

  • wenn ein Präfix verwendet wird: xsl:template, fo:block, xsd:complexType.
    Wenn du sowas siehst, weiss du es. Dann wird irgendwo im Dokument auch ein xmlns:xsl="...", xmlns:fo="..." etc. stehen.

  • im anderen Fall wird der Namensraum gleich als Default-Namensraum definiert, dann braucht man keinen Präfix mehr für die Elemente aus diesem Namensraum. Das ist, wie z.B. beim XHTML:
    <html xmlns="http://www.w3.org/1999/xhtml">
    Jetzt braucht man nicht html:body, html:div etc zu schreiben.

<html xmlns="http://www.w3.org/1999/xhtml"> und <html:html xmlns:html="http://www.w3.org/1999/xhtml"> sind also gleichwertig, jedoch kann man sie Unterschiedlich verwenden.

Naja, ich will die XML's schon validieren, aber wie gesagt, alle Zielsysteme kennen die XSD und übergeben diese als Atrribut. Wozu dann der Eintrag im Header des Dokuments.

Weil es nunmal sein muss.

Wo ich dich gerade an der Strippe habe. Aufgefallen ist das Ganze, weil ich von verschiedenen Produzenten, verschiedene XML's bekomme, welche alle den gleichen Inhalt haben, bis auf die Headerdeklaration, das steht entweder nichts, oder nur die Hälfte oder alles und so wie ich es jetzt verstanden habe auch noch grundfalsch ;)
Mein Validator: Java:Sax meckert an, wenn nichts drin steht mit folgender Meldung: Datei ist nicht valid. cvc-elt.1: Die Deklaration von Element 'blubber' kann nicht gefunden werden.

Die Fehlermeldung könnte eben auch bedeuten, dass zwar ein Namensraum verwendet wird, aber im Schema selbst ist er nicht definiert, weshalb auch die Elementedeklaration nicht gefunden werden kann. Oder ihm fehlt einfach eie XSD-Datei, oder ...

Da ich dein(e) XMLs nicht kenne, kann ich nichts dazu sagen.
Wie sind denn nun die Elemente definiert? Wird ein Namensraum nun verwendet oder nicht?

Grüße
Thomas