Was ist ein xs: NCName-Typ und wann sollte er verwendet werden?


97

Ich habe eine meiner XML-Dateien über einen Schemagenerator ausgeführt und alles, was generiert wurde, war das, was erwartet wurde, mit Ausnahme eines Knotens:

<xs:element name="office" type="xs:NCName"/>

Was genau ist xs:NCName? Und warum sollte man es lieber benutzen xs:string?

Antworten:


92

NCName ist ein nicht kolonisierter Name, z. B. "Name". Im Vergleich zu QName, bei dem es sich um einen qualifizierten Namen handelt, z. B. "ns: name". Wenn Ihre Namen nicht durch unterschiedliche Namespaces qualifiziert werden sollen, handelt es sich um NCNames.

xs: string schränkt Ihre Namen überhaupt nicht ein, aber xs: NCName lässt grundsätzlich nicht zu, dass ":" in der Zeichenfolge angezeigt wird.


1
leere Zeichenfolge ist auch inxs:NCName
WeizhongTu

108

@skyl hat mich praktisch dazu gebracht, diese Antwort zu schreiben. Bitte beachten Sie die Redundanz.

NCNamesteht für "nicht kolonisierter Name". NCName kann als regulärer Ausdruck eines XML-Schemas definiert werden[\i-[:]][\c-[:]]*

... und was bedeutet dieser Regex?

\iund \csind Escapezeichen mit mehreren Zeichen, die in der XML-Schemadefinition definiert sind.
http://www.w3.org/TR/xmlschema-2/#dt-ccesN
\i ist das Escape für den Satz von anfänglichen XML-Namenszeichen und \cist der Satz von XML-Namenszeichen. [\i-[:]]bedeutet eine Menge, die aus der Menge besteht, mit \iAusnahme einer Menge, die aus dem Doppelpunkt besteht :. Im Klartext würde es also "jedes Anfangszeichen, aber nicht :" bedeuten . Der gesamte reguläre Ausdruck lautet "Ein anfängliches XML-Namenszeichen, aber kein Doppelpunkt, gefolgt von null oder mehr XML-Namenszeichen, aber kein Doppelpunkt."

Praktische Einschränkungen eines NCNames

Die praktischen Einschränkungen von NCName sind , dass es nicht mehrere Symbolzeichen wie enthalten kann :, @, $, %, &, /, +, ,, ;, Leerzeichen oder andere Klammer. Außerdem kann ein NCName nicht mit einer Zahl, einem Punkt oder einem Minuszeichen beginnen, obwohl sie später in einem NCName erscheinen können.

Wo werden NCNames benötigt?

In Namespace-konformen XML-Dokumenten müssen alle Namen entweder qualifizierte Namen oder NCNames sein. Die folgenden Werte müssen NCNames sein (keine qualifizierten Namen):

  • Namespace-Präfixe
  • Werte, die eine ID darstellen
  • Werte, die einen IDREF darstellen
  • Werte, die eine NOTATION darstellen
  • Verarbeitungsanweisungsziele
  • Entitätsnamen

3
Die Zeile "Außerdem kann ein NC-Name nicht mit einer Nummer beginnen" hat mir geholfen zu verstehen, dass eine Nummer keine "xs: ID" sein kann
Sean Murphy

Wie kann ich diesen Ausdruck in eine Programmiersprache wie Java oder JS konvertieren?
Calbertts


Sie können überprüfen, ob es sich um einen regulären CName mit dem regulären Ausdruck handelt: "[abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ _] [\\ w \\. \\ - \\ d] *". Das bedeutet. Der Wert sollte mit einem Buchstaben oder Unterstrich beginnen und enthält dann Wörter, Punkte, Striche, Unterstriche und Ziffern. Sie können es versuchen bei: regexr.com
Naxos84

Meine oben angegebene Regex behandelt nur lateinische Buchstaben. Wenn Sie die vollständige Überprüfung von NCNames gemäß der Spezifikation w3.org/TR/1999/REC-xml-names-19990114/#NT-NCName wünschen , sollten Sie diese Klasse verwenden: java2s.com/Code/Java/XML/…
Naxos84

29

Praktisch gesprochen...

Erlaubte Zeichen: - , ., 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z, _, a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p,q, r, s, t, u, v, w, x, y,z

Auch -und .kann nicht als erstes Zeichen des Werts verwendet werden.

Nicht zulässige Zeichen: , !, ", #, $, %, &, ', (, ), *, +, ,, /, :, ;, <, =, >, ?, @, [, \, ], ^, `, {, |, },~


2
Ich denke, hier fehlen viele erlaubte Zeichen wie zum Beispiel é oder ø.
Eric Bloch

Um diese Nicht-ASCII-Fälle abzudecken, sollte es \ p {L} + als Teil des Zeichensatzes enthalten
Kenston Choi

11
Ziffern können auch nicht als erstes Zeichen verwendet werden.
Thilo

5

http://books.xmlschemata.org/relaxng/ch19-77215.html

Keine Leerzeichen oder Doppelpunkte. Ermöglicht "_" und "-".

Sie würden dies anstelle einer Zeichenfolge verwenden, damit Sie überprüfen können, ob der Wert auf das zulässige Maß beschränkt ist. Es passt gut zu bestimmten Konventionen für Namen / Bezeichner, wie zum Beispiel Djangos Konzept der "Schnecke".

Ich stimme der Person zu, die [\i-[:]][\c-[:]]*für uns ins Englische übersetzt.


11
Ich habe eine Antwort hinzugefügt, die [\i-[:]][\c-[:]]*ins Englische übersetzt wird. Gehen Sie voran und stimmen Sie ab, wie Sie versprochen haben;)
jasso
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.