Nach einer Einführung der Namensräume als Erweiterung zur XML und einem Exkurs über IRIs, URIs, URLs und URCs erfahren Sie, wie Namensräume syntaktisch deklariert werden können. Sie sehen an Beispielen, wie Namensräume schlecht angewendet werden und erfahren, wie Sie es besser machen können. Sie erhalten Kenntnis über die Vorrang-Regelungen bei Namensräumen und erhalten abschließend einen einfachen Regelsatz zur Bestimmung von zu Elementen und Attributen zugeordneten Namensräumen.
Weil XML in sehr vielen verschiedenen Bereichen
verwendet werden kann, ist es sehr erfolgreich.
Unter anderem auch, weil es so einfach ist, eine
Grammatik (wie beispielsweise eine DTD) für neue
Anwendungsfelder zu erstellen und damit für das
spezielle Einsatzszenario ein
maßgeschneidertes
XML Datenmodell zu erstellen. Dies bedeutet, daß
Namen in einem XML-Dokument immer im Zusammenhang
mit einem bestimmten Schema verstanden/interpretiert
werden müssen. Solange ein Dokument nur Namen aus
einem Bereich verwendet, ist das ziemlich einfach.
Heute aber kombinieren Dokumente Namen aus
verschiedenen Anwendungsfeldern. XML-Namensräume
bieten einem hier die Möglichkeit, die Namen in
XML-Dokumenten mit einem Namensraum (=virtueller
Bereich) zu verknüfen und sie so voneinander
unterscheidbar und eindeutig identifizierbar zu
halten.
|
|
XML-Namensräume stellen eine XML-basierte Syntax zur Verfügung, um Element- und Attributnamen eines Vokabulars eindeutig zu identifizieren und so Bedeutungsüberschneidungen durch gleichbenannte Elemente- oder Attribute in zu unterscheidenden Vokabularen auszuschließen. XML-Namensräume bilden damit die notwendige Voraussetzung zur freien dezentralen Entwicklung eigener Vokabulare ohne die Möglichkeit einer späteren Syndikatisierung zu verlieren.
Jeder XML-Namensraum wird durch eine gültige IRI oder URI identifziert. Diese dient ausschließlich der Benennung, daher muß sie nicht auf eine gültige Ressource verweisen.
Nachfolgend sehen Sie eine Vielzahl gültiger URIs versammelt:
http://www.fh-augsburg.de/
http://meinrechner.fh-augsburg.de/
mailto:vorlesung@barbara-zengler.de
ftp://ftp.shareware.com/
file:///C:/bsz/web/vorlesung/intro.html#(16)
#(16)
urn:oasis:names:specification:docbook:dtd:xml:4.1.2
urn:oid:1.3.6.1.2.1.27
org.omg/standards/UML
http://www.barbara-zengler.de/vorlesung/toc.html
http://www.fh-augsburg.de/
mailto:vorlesung@barbara-zengler.de
ftp://example.org/aDirectory/aFile
news:comp.infosystems.www
tel:+1-816-555-1212
ldap://ldap.example.org/c=GB?objectClass?one
urn:oasis:SAML:1.0
urn
urn:oasis:names:specification:docbook:dtd:xml:4.1.2
urn:oid:1.3.6.1.2.1.27
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <http://www.example.com/sales:Rechnung> <http://www.example.com/sales:Kunde> <http://www.example.com/sales:KundenNr>4711</http://www.example.com/sales:KundenNr> <http://www.example.com/sales:Name>Max Mustermann</http://www.example.com/sales:Name> <http://www.example.com/sales:Anschrift> <http://www.example.com/sales:Straße>Musterplatz 1</http://www.example.com/sales:Straße> <http://www.example.com/sales:PLZ>12345</http://www.example.com/sales:PLZ> <http://www.example.com/sales:Ort>Musterstadt</http://www.example.com/sales:Ort> </http://www.example.com/sales:Anschrift> </http://www.example.com/sales:Kunde> <http://www.example.com/sales:Rechnungsposten> ... </http://www.example.com/sales:Rechnungsposten> </http://www.example.com/sales:Rechnung>
/
(Slash) ist in Bezeichnern nicht erlaubt:
/
:
U+002F
(=
#x2F
)
[4] NameStartChar ::= ":" | [A-Z] | "_" | [a-z] | [#xC0-#xD6] | [#xD8-#xF6] | [#xF8-#x2FF] | [#x370-#x37D] | [#x37F-#x1FFF] | [#x200C-#x200D] | [#x2070-#x218F] | [#x2C00-#x2FEF] | [#x3001-#xD7FF] | [#xF900-#xFDCF] | [#xFDF0-#xFFFD] | [#x10000-#xEFFFF] [4a] NameChar ::= NameStartChar | "-" | "." | [0-9] | #xB7 | [#x0300-#x036F] | [#x203F-#x2040] [5] Name ::= NameStartChar (NameChar)*
gebunden).
[1] NSAttName ::= PrefixedAttName | DefaultAttName [2] PrefixedAttName ::= 'xmlns:' NCName [NSC: Reserved Prefixes and Namespace Names] [3] DefaultAttName ::= 'xmlns' [4] NCName ::= NCNameStartChar NCNameChar* /* An XML Name, minus the ":" */ [5] NCNameChar ::= NameChar - ':' [6] NCNameStartChar ::= NameStartChar - ':'
xmlns
.
Ein qualifizierter Name ist ein Name, der der Interpretation von Namensräumen unterliegt.
[7] QName ::= PrefixedName | UnprefixedName [8] PrefixedName ::= Prefix ':' LocalPart [9] UnprefixedName ::= LocalPart [10] Prefix ::= NCName [11] LocalPart ::= NCName [4] NCName ::= NCNameStartChar NCNameChar* /* An XML Name, minus the ":" */
{namespaceName}elementName
<{http://www.example.com/sales}Rechnung>
http://www.xyz.com/sales
an das Präfix
myNS1
<?xml version="1.1" encoding="UTF-8" standalone="yes"?>
<myNS1:Rechnung xmlns:myNS1="http://www.xyz.com/sales">
<myNS1:Kunde>
<myNS1:KundenNr>4711</myNS1:KundenNr>
<myNS1:Name>Max Mustermann</myNS1:Name>
<myNS1:Anschrift>
<myNS1:Strasse>Musterplatz 1</myNS1:Strasse>
<myNS1:PLZ>12345</myNS1:PLZ>
<myNS1:Ort>Musterstadt</myNS1:Ort>
</myNS1:Anschrift>
</myNS1:Kunde>
<myNS1:Rechnungsposten>
<!--...-->
</myNS1:Rechnungsposten>
</myNS1:Rechnung>lesbarbleibt.
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <neurotic> <prefix:elem xmlns:prefix="http://ns1.com/"> <prefix:child>content</prefix:child> </prefix:elem> <prefix:elem xmlns:prefix="http://ns2.com/"> <prefix:child>content</prefix:child> </prefix:elem> </neurotic>
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <borderline> <prefix1:elem xmlns:prefix1="http://ns1.com/"> <prefix1:child>content</prefix1:child> </prefix1:elem> <prefix2:elem xmlns:prefix2="http://ns1.com/"> <prefix2:child>content</prefix2:child> </prefix2:elem> </borderline>
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <psychotic xmlns:prefix1="http://ns1.com/" xmlns:prefix2="http://ns1.com/"> <prefix1:elem> <prefix2:child>content</prefix2:child> </prefix1:elem> <prefix2:elem> <prefix1:child>content</prefix1:child> </prefix2:elem> </psychotic>
http://www.example.com
<abc:ElementA xmlns:abc="http://www.example.com"
xmlns:xyz="http://www.example.com">
<ElementB xmlns="http://www.example.com">
<ElementC/>
</ElementB>
<xyz:ElementB>
<abc:ElementC/>
</xyz:ElementB>
</abc:ElementA><ElementA xmlns="http://www.example.com"
xmlns:myNamespace="http://www.example.com">
<foo:ElementB xmlns:foo="http://www.example.com">
<myNamespace:ElementC/>
</foo:ElementB>
<ElementB xmlns="http://www.example.com">
<myNamespace:ElementC/>
</ElementB>
</ElementA>
xmlns
-Attribut ohne trennenden Doppelpunkt und Präfix
definiert einen
Vorgabenamensraum.

<xyz:abc xmlns="..." ..>
)
Das Beispiel zeigt die Verwendung zweier Vokabulare (SVG und MathML), die beide ein mit set benanntes Element definieren. Die qualifizierten Namen beider Elemente unterscheiden sich, da sie dem Elementnamen die Namensraum-URI voranstellen.
<?xml version="1.0" standalone="yes"?>
<document>
<svg xmlns="http://www.w3.org/2000/svg">
<g transform="translate(100,100)">
<text id="TextElement" x="0" y="0" style="font-family:Verdana; font-size:35.27; visibility:hidden">
It's alive!
<set attributeName="visibility" attributeType="CSS" to="visible" begin="3s" dur="6s" fill="freeze"/>
</text>
</g>
</svg>
<math xmlns="http://www.w3.org/1998/Math/MathML">
<set>
<ci> b </ci>
<ci> a </ci>
<ci> c </ci>
</set>
</math>
</document>ElementA
,
ElementB
und
ElementC
? (Auflösung mit Taste
n
)
ElementA
: Namensraum
urn:namspaces:Namespace1
ElementB
: Namensraum
urn:namspaces:Namespace1
ElementC
: Namensraum
urn:namespace:Namespace2
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <ElementA xmlns="urn:namspaces:Namespace1" xmlns:ns1="urn:namespace:Namespace2"> <ElementB/> <ns1:ElementC/> </ElementA>
<ElementX xmlns=""/>
)
<?xml version="1.1" encoding="UTF-8" standalone="yes"?>
<x xmlns:n1="http://www.w3.org">
<n1:a/> <!-- legal; the prefix n1 is bound to http://www.w3.org -->
<x xmlns:n1="">
<n1:a/> <!-- illegal; the prefix n1 is not bound here -->
<x xmlns:n1="http://www.w3.org">
<n1:a/> <!-- legal; the prefix n1 is bound again -->
</x>
</x>
</x>
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Wurzelelement>
<ElementA xmlns:ns1="http://www.example.com/ns1" xmlns:ns2="http://www.example.com/ns2">
<ns1:ElementB att1="ijk">
<ElementD att1="uvw" xmlns="http://www.example.com/ns3">
<ElementC att2="abc" ns2:att2="xyz"/>
</ElementD>
</ns1:ElementB>
</ElementA>
</Wurzelelement>att1
von
ElementB
noch von
ElementD
befinden sich in einem Namensraum.
att2
mit dem Wert
xyz
dagegen ist dem Namensraum
http://www.example.com/ns2
zugeordnet.
att2
mehrfach auftretenkann. Mit dem Namensraum ist gewährleistet, daß es eindeutig identifiziert werden kann.
Namensräume, die durch Überschreiben des
Vorgabenamensraumes zugewiesen werden wirken sich
ausschließlich auf Elemente und deren direkte oder
transitive Kindelemente aus, sofern diese den
Namensraum nicht wieder verändern.
Namensräume, die durch explizite Präfixangabe
zugewiesen werden, wirken sich ausschließlich auf
dasjenige Element aus vor dessen Name das Präfix
plaziert ist.
Namensräume für Attribute werden ausnahmslos durch
explizite Präfixangabe festgelegt und gelten
ausschließlich für das Attribut selbst.
Ein Element befindet sich in demjenigen Namensraum...
giltim vorangehenden Satz umschließt sich nicht nur die Überschreibung des Vorgabenamensraumes im direkten Elternelement, sondern auch eine dort geltende Namensraumüberschreibung die in dessen Elternelement oder dessen Elternelement ... stattfand.
Ein Attribut befindet sich in demjenigem Namensraum, der durch explizite Präfixangabe festelegt wurde.