Pauli: Namespace Grundlagenfrage

Moin, folgendes Beispiel:

<xs:schema
			targetNamespace="https://www.ich.de/test""
			xmlns="https://www.ich.de/test"
			xmlns:xs="http://www.w3.org/2001/XMLSchema">
...

Nun meine Frage: im Namespace xs ist ja wohl das XMLSchema an sich definiert. Nur, wie kann das verarbeitende Programm darauf zugreifen? Die URL im Beispiel ist ja nur der Name des NS. Müsste da nicht, so wie bei include/import, noch eine schemaLocation angegeben werden?

Danke und Gruß, Pauli

  1. Hallo Pauli,

    folgendes Beispiel:

    <xs:schema targetNamespace="https://www.ich.de/test"" xmlns="https://www.ich.de/test" xmlns:xs="http://www.w3.org/2001/XMLSchema"> ...

    Nun meine Frage: im Namespace xs ist ja wohl das XMLSchema an sich definiert. Nur, wie kann das verarbeitende Programm darauf zugreifen? Die URL im Beispiel ist ja nur der Name des NS. Müsste da nicht, so wie bei include/import, noch eine schemaLocation angegeben werden?

    Die schemaLocation referenziert ein Schema, etwa in einem XML-Instanzdokument oder bei den genannten eingefügten Schema-Teilen.

    test.xsd

    <?xml version="1.0" encoding="UTF-8"?>
    <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified"
      targetNamespace="http://example.org/myns">
      <xs:element name="test">
        <xs:complexType>
          <xs:sequence>
            <xs:element maxOccurs="unbounded" minOccurs="0" name="bla"/>
          </xs:sequence>
        </xs:complexType>
      </xs:element>
    </xs:schema>
    
    

    test.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <test xmlns="http://example.org/myns"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:schemaLocation="http://example.org/myns test.xsd">
      <bla>Test</bla>
    </test>
    
    

    Grüße,
    Thomas

    1. Die schemaLocation referenziert ein Schema, etwa in einem XML-Instanzdokument oder bei den genannten eingefügten Schema-Teilen.

      Ja genau. Müsste jetzt nicht auch das Schema "http://www.w3.org/2001/XMLSchema" referenziert werden? Woher soll das verarbeitende Programm wissen was da drin steht?

      1. Hallo Pauli,

        Die schemaLocation referenziert ein Schema, etwa in einem XML-Instanzdokument oder bei den genannten eingefügten Schema-Teilen.

        Ja genau. Müsste jetzt nicht auch das Schema "http://www.w3.org/2001/XMLSchema" referenziert werden? Woher soll das verarbeitende Programm wissen was da drin steht?

        Was soll da drin stehen? Ein Namespace ist ein eindeutiger Identifier (im Grunde ein String) und die meistens hinterlegte URI muss nicht mal existieren. Sie existieren meistens doch, weil Leute die URIs im Browser aufrufen und sich dann bei 404er wundern und Fragen stellen. ;)

        Ein Validierungstool muss natürlich die Ideen hinter Schema, DTD oder RELAX NG kennen und die zugehörigen Dokumente auswerten können, also auf XMLSchema-instance, DOCTYPE oder <?xml-model … ?> konditioniert sein.

        Grüße,
        Thomas

        1. ... Ein Namespace ist ein eindeutiger Identifier …

          Klar

          Ein Validierungstool muss natürlich ... konditioniert sein.

          Genau das meine ich ja. Um alles transparent und uptodate zu halten, hätte ich gedacht, dass es eine schemaLocation gibt, von der das Validierungsprogramm seine Vorgaben erhält. Also ist dem nicht so und die Tools haben die XML Vorgaben vom w3c schon integriert. Nicht sehr toll wenn ihr mich fragt (transparent und uptodate).

          Gruß

          1. Hallo Pauli,

            ich verstehe deinen Einwand nicht. Um einen Standard implementieren zu können, muss er aufgeschrieben worden sein. Zu diesem Aufschrieb gehört der Namespace, mit dessen Definitionen gearbeitet wird.

            WAS sollte sich ein Programm denn vom W3C herunterladen, um mit dem XML Namespace xmlns:foo="http://example.org/2019/foo-masters" etwas anfangen zu können? Ein solcher Namespace legt Semantik fest. Er referenziert eine fachliche Vorgabe, die angibt, was unter foo:barkeep zu verstehen ist und was die Elemente darin bedeuten sollen. Es ist nicht einmal gesagt, dass es für die Elemente des foo-masters Namespace genau ein Schema gibt. Es kann viele geben.

            Schlimmer noch: Einem konkreten XML Schema steht es frei, mehrere Namespaces zu benutzen. Das ist absolut gültig. Mein foo-masters Namespace könnte Elemente wie list, entry, und comment definieren. MEHR nicht. Und dann könnte ich ein XML-Dokument schreiben wie dies:

            <?xml version="1.0" encoding="UTF-8"?>
            <foo:list xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:foo="http://example.org/2019/foo-masters">
              <foo:entry key="A">
                <xs:schema>
                   ... viele Schema-Zeilen
                </xs:schema>
                <foo:comment>
                  Verwende dieses Schema im Falle, dass ein foo mindestens ein bar enthält
                </foo:comment>
              </foo:entry>
              <foo:entry key="B">
                <xs:schema>
                   ... viele andere Schema-Zeilen
                </xs:schema>
                <foo:comment>
                  Verwende dieses Schema, wenn das foo kein bar, aber drei snafu enthält
                </foo:comment>
              </foo:entry>
            </foo:list>
            

            Absolut gültiges XML, es mixt Elemente verschiedener Namespaces munter vor sich hin. foo-masters könnte weitere Elemente definieren, die für eine Schemaliste nicht relevant sind. Man kann ein Schema formulieren, das verlangt, dass ein foo:entry ein xs:schema und ein foo:comment enthalten muss. All das gibt es in der wilden weitem XML Welt.

            WIE sollte man das in Form einer Download-Ressource darstellen können?

            Rolf

            --
            sumpsi - posui - clusi
            1. Ok, danke erstmal für die antwort. Allerdings:

              Wofür braucht man "xmlns="http://www.w3.org/2001/XMLSchema" ?

              Dafür, dass man in bestimmten, vorgegebenen Grenzen/Vorgaben/... bleibt. Woher weiss das Programm das diese Vorgaben umsetzen soll, was da die Grenzen/Vorgaben/... sind?

              1. Hallo Pauli,

                Wofür braucht man "xmlns="http://www.w3.org/2001/XMLSchema" ?

                Dafür, dass man in bestimmten, vorgegebenen Grenzen/Vorgaben/... bleibt. Woher weiss das Programm das diese Vorgaben umsetzen soll, was da die Grenzen/Vorgaben/... sind?

                In diesem Artikel steht eigentlich das Wesentliche.

                Typischerweise möchte man verschiedene XML-Standards mischen und es können ggf. gleichnamige Elemente/Attribute auftreten, z. B. ein title-Element in einer SVG-Vektorgrafik, welche wiederum direkt in HTML eingebettet sein kann und dort gibt es auch ein title-Element. (Es gibt title als Kindelement von svg, aber auch von circle, rect, path usw.)

                Oder man möchte Markup via XSLT erzeugen. Dann stehen die xsl:*-Elemente für die eigentliche Programmsyntax und innerhalb stehen die Ausgaben:

                <xsl:template match="/">
                  <html>
                    <!-- hier HTML-Code ausgeben … -->
                  </html>
                </xsl:template>
                
                

                Instruktiver bei der Excel-Generierung mit dem ganzen Office-Foo:

                <?xml version="1.0" encoding="UTF-8"?>
                <xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                  xmlns:fn="http://www.w3.org/2005/xpath-functions"
                  xmlns:xs="http://www.w3.org/2001/XMLSchema"
                  xmlns="urn:schemas-microsoft-com:office:spreadsheet"
                  xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet"
                  xmlns:x="urn:schemas-microsoft-com:office:excel"
                  exclude-result-prefixes="fn xs">
                  
                  <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
                
                
                  <xsl:template match="/">
                    <!-- weitere Ausgaben … -->
                    
                    <Row>
                      <Cell>
                        <Data ss:Type="Number">
                          <xsl:value-of select=""/>
                        </Data>
                      </Cell>
                      <!-- weitere Ausgaben … -->
                    </Row>
                
                    <!-- weitere Ausgaben … -->    
                  </xsl:template>
                  
                </xsl:stylesheet>
                
                

                Grüße,
                Thomas

                1. Danke für eure Antworten. Aber ich habe s immer noch nicht durchblickt. Was würde passieren, wenn im Beispiel ganz oben kein xmlns:xs="http://www.w3.org/2001/XMLSchema" stehen würde?

                  1. Hallo Pauli,

                    Danke für eure Antworten. Aber ich habe s immer noch nicht durchblickt. Was würde passieren, wenn im Beispiel ganz oben kein xmlns:xs="http://www.w3.org/2001/XMLSchema" stehen würde?

                    Dann könnte das Präfix xs nicht verwendet werden. Ganz ohne Namespace im Schema-Dokument würde die Zuweisung des Schemas im XML-Dokument nicht klappen. Das wäre Minimum bzgl. meines Beispiels:

                    <?xml version="1.0" encoding="UTF-8"?>
                    <schema elementFormDefault="qualified" xmlns="http://www.w3.org/2001/XMLSchema"
                      targetNamespace="http://example.org/myns">
                      <element name="test">
                        <complexType>
                          <sequence>
                            <element maxOccurs="unbounded" minOccurs="0" name="bla"/>
                          </sequence>
                        </complexType>
                      </element>
                    </schema>
                    
                    

                    Grüße,
                    Thomas

                    1. Hallo ThomasM,

                      da war ich vor 100 Minuten schon 😂

                      Wo ich mir nicht 100% sicher bin: könnte man die xmlns-Angabe ganz weglassen? Würden XML-Validatoren dann protestieren? Habe gerade keine Zeit zum ausprobieren.

                      Rolf

                      --
                      sumpsi - posui - clusi
                      1. Hallo Rolf,

                        Wo ich mir nicht 100% sicher bin: könnte man die xmlns-Angabe ganz weglassen? Würden XML-Validatoren dann protestieren? Habe gerade keine Zeit zum ausprobieren.

                        Die Namensräume dürften direkt verdrahtet sein. Mein XML-Editor meckert ohne sofort und validiert nicht mehr mit bzw. wirft genau den xmlns-Fehler. Wohlgemerkt bezogen auf die URI, Präfixe können geändert werden. Deshalb sieht man ja auch wahlweise xs:* oder xsd:*.

                        Grüße,
                        Thomas

      2. Hallo Pauli,

        ich glaube, dein Missverständnis ist, dass sich hinter "http://www.w3.org/2001/XMLSchema" eine echte Ressource verbirgt, die man zum Verarbeiten eines Schemas braucht. Das ist nicht so. Dieser Namespace ist einfach ein Name, und wenn ein Programm ein Schema verarbeiten können will, dann

        • muss es wissen, was ein XML Schema ist
        • muss es prüfen, ob ein xmlns:xyz Attribut im XML Dokument drin ist, das dem Alias xyz den Namespace "http://www.w3.org/2001/XMLSchema" zuordnet. Dann weiß das Programm, dass alle Elemente die ein xyz: Prefix haben, zum Schema-Namespace gehören.

        Sinn ist vor allem, Mehrdeutigkeiten zu vermeiden. XML wird so weit verbreitet eingesetzt, dass keiner garantieren kann, dass <element> ein Schema-Element meint. Es könnte ja auch zum Bauingenieurswesen gehören und ein Bauelement meinen. Darum definiert man Namespaces. Es gibt auch einen Default-Namespace (der mit xmlns="..."). Du bist nicht gezwungen, den Schema-Namespace xs zu nennen.

        Du könntest, wenn ich gerade nicht ganz schief liege, das Beispielschema von Thomas auch so schreiben:

        <?xml version="1.0" encoding="UTF-8"?>
        <schema xmlns="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified"
          targetNamespace="http://example.org/myns">
          <element name="test">
            <complexType>
              <sequence>
                <element maxOccurs="unbounded" minOccurs="0" name="bla"/>
              <sequence>
            </complexType>
          </element>
        </schema>
        

        Solange Du nur Elemente aus einem Namespace brauchst, ist ein Prefix nicht zwingend nötig (meine ich). Es ist nur häufiger Brauch, xs für den Schema-Namespace zu verwenden.

        Rolf

        --
        sumpsi - posui - clusi
        1. Ok, danke erstmal für die antwort. Allerdings:

          Wofür braucht man "xmlns="http://www.w3.org/2001/XMLSchema" ?

          Dafür, dass man in bestimmten, vorgegebenen Grenzen/Vorgaben/... bleibt. Woher weiss das Programm das diese Vorgaben umsetzen soll, was da die Grenzen/Vorgaben/... sind?

          1. Hallo Pauli,

            ein Programm, das eine XML Datei verarbeiten will, muss wissen, was die vorgefundenen Elemente und Attribute bedeuten. Dazu dient der Namespace.

            Wenn im XML steht: xmlns:xs="http://www.w3.org/2001/XMLSchema", dann definiert das den Default-Namespace und der XML-Reader weiß, dass Elemente, die das Namespace-Prefix xs tragen, zum XMLSchema 1.0 oder XMLSchema 1.1 gehören.

            "XML-Reader" ist der Teil eines Anwendungsprogramms, das die Textdatei in ein XML-Dokument oder einen XML-Stream übersetzt (es gibt verschiedene Typen von Readern).

            Das eigentliche Anwendungsprogramm verwendet den Reader, um die vorgefundenen XML Inhalte weiter zu verarbeiten. Dinge wie Namespace-Zuordnungen oder - sofern vorhanden - Schema-Validierung erledigt der Reader.

            D.h. wenn Du ein XML-Dokument hast, das das Schema festlegt, dann kannst Du dem XML-Reader sagen: "Lies foo.xml und validiere das mit foo-schema.xml". Der Reader kann nun stumpf annehmen, dass foo-schema.xml ein XMLSchema ist. Das wäre aber dumm; XML gibt's wie Sand am Meer und die Namespace-Angaben sind gerade dafür gemacht, mögliche Mehrdeutigkeiten zu verhindern. Ein XML-Dokument mit Rootnode <schema> kann und darf jeder schreiben, aber den Namespace http://www.w3.org/2001/XMLSchema dafür angeben darf man nur, wenn es auch wirklich ein Schema ist (andernfalls ist das Dokument ungültig).

            Angenommen, irgendwer erfindet nächstes Jahr XMLSchema 2.0, eine ganz tolle Innovation. Eine solche Schemadatei müsste einen anderen Namespace bekommen, denn der alte XML-Reader, der nur XMLSchema 1.1 kennt, würde damit nicht klarkommen. Möglicherweise würde man diesen Namespace http://www.w3.org/2020/XMLSchema nennen, und der alte XML-Reader würde dann sagen: Das Element schema in diesem Namespace kann ich nicht verarbeiten.

            Woher weiss das Programm das diese Vorgaben umsetzen soll, was da die Grenzen/Vorgaben/... sind?

            Die Anwendung der Schema-Inhalte, d.h. das Verstehen des XMLSchema-Dokuments und das Durchführen der Prüfungen, die sich daraus ergeben, kann man meines Erachtens nicht abstrakt definieren. Das ist Programmierarbeit, und das Ergebnis ist der XML-Validator, der Teil des XML-Readers ist. Ein XML-Validator, der das fiktive XMLSchema 2.0 beherrscht, sieht sicherlich anders aus als einer für XMLSchema 1.1. Beim Übergang XMLSchema 1.0 nach 1.1 ist der Namespace gleich geblieben, das W3C behauptet, sie hätten rück- und vorwärtskompatibel gearbeitet.

            D.h. du brauchst einen XML-Validator. Sowas gibt es eigenständig oder als Teil eines XML-Readers. Der Validator weiß, wie ein Schema auszsehen hat. Er liest das Schema und kann an Hand dessen die Gültigkeit des eigentlichen XML Dokuments überprüfen.

            Das geht auch rekursiv. Es gibt ein XMLSchema, das XMLSchema-Dokumente beschreibt. D.h. der Validator kann auf diesem Weg auch das Schema, das Du ihm gibst, zunächst validieren, bevor er es als Arbeitsgrundlage nimmt.

            Zu finden ist das hier: https://www.w3.org/2001/XMLSchema - es ist in diesem Fall tatsächlich so, dass der Namespace eine real existierende URL ist.

            Rolf

            --
            sumpsi - posui - clusi
            1. Also ist die Definition des ganz oben genannten xml:xs im bearbeitenden Programm (welches auch immer) hinterlegt? Das war eigentlich meine Frage :)

              1. Hallo Pauli,

                Also ist die Definition des ganz oben genannten xml:xs im bearbeitenden Programm (welches auch immer) hinterlegt?

                Ja. Wie gesagt, die Präfixe sind wählbar, die URIs für fertige Standards sind vorgegeben und in Software implementiert.

                Das war eigentlich meine Frage :)

                Kam nicht direkt so an. 😉

                Grüße,
                Thomas

                1. Ahh. Vielen Dank für Eure Geduld :)