Che cos'è un tipo xs: NCName e quando dovrebbe essere utilizzato?


97

Ho eseguito uno dei miei file xml tramite un generatore di schemi e tutto ciò che è stato generato è stato quello previsto, ad eccezione di un nodo:

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

Cos'è esattamente xs:NCName? E perché si dovrebbe usarlo, piuttosto xs:string?

Risposte:


92

NCName è un nome non colonizzato, ad esempio "nome". Rispetto a QName che è un nome completo, ad esempio "ns: name". Se i tuoi nomi non dovrebbero essere qualificati da spazi dei nomi diversi, allora sono NCNames.

xs: string non pone alcuna restrizione sui tuoi nomi, ma xs: NCName fondamentalmente non consente a ":" di apparire nella stringa.


1
anche la stringa vuota non è consentita inxs:NCName
WeizhongTu

108

@skyl mi ha praticamente provocato a scrivere questa risposta, quindi per favore fai attenzione alla ridondanza.

NCNamesta per "nome non colonizzato". NCName può essere definito come un'espressione regolare di XML Schema[\i-[:]][\c-[:]]*

... e cosa significa quella regex?

\ie \csono escape multi-carattere definiti nella definizione dello schema XML.
http://www.w3.org/TR/xmlschema-2/#dt-ccesN
\i è l'escape per il set di caratteri del nome XML iniziale ed \cè il set di caratteri del nome XML. [\i-[:]]indica un insieme che consiste nell'insieme \iescludendo un insieme che consiste nel carattere dei due punti :. Quindi, in un inglese semplice, significherebbe "qualsiasi carattere iniziale, ma non :". L'intera espressione regolare si legge come "Un carattere di nome XML iniziale, ma non due punti, seguito da zero o più caratteri di nome XML, ma non due punti."

Restrizioni pratiche di un NCName

Le restrizioni pratiche di NCName sono che non può contenere diversi caratteri di simbolo, come :, @, $, %, &, /, +, ,, ;, spazi bianchi o caratteri diversi parentesi. Inoltre un NCName non può iniziare con un numero, un punto o un carattere meno sebbene possano apparire in seguito in un NCName.

Dove sono necessari gli NCNames

Nei documenti XML conformi allo spazio dei nomi tutti i nomi devono essere nomi qualificati o NCNames. I seguenti valori devono essere NCNames (nomi non qualificati):

  • prefissi dello spazio dei nomi
  • valori che rappresentano un ID
  • valori che rappresentano un IDREF
  • valori che rappresentano una NOTAZIONE
  • elaborazione degli obiettivi delle istruzioni
  • nomi di entità

3
La riga "Inoltre un NCName non può iniziare con un numero" mi ha aiutato a capire che un numero non può essere un "xs: ID"
Sean Murphy

Come posso convertire quell'espressione in un linguaggio di programmazione come Java o JS?
calbertts


Puoi controllare se si tratta di un normale CName con la regex: "[abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ _] [\\ w \\. \\ - \\ d] *". Questo significa. il valore dovrebbe iniziare con una lettera o un trattino basso e quindi contenere parole, punti, trattini, trattini bassi, cifre. Puoi provarlo su: regexr.com
Naxos84

La mia espressione regolare data sopra gestisce solo lettere latine. Se vuoi il controllo completo su NCNames secondo la specifica w3.org/TR/1999/REC-xml-names-19990114/#NT-NCName dovresti usare questa classe: java2s.com/Code/Java/XML/…
Naxos84

29

In pratica ...

I caratteri consentiti: - , ., 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

Inoltre, -e .non può essere utilizzato come primo carattere del valore.

Caratteri non consentiti: , !, ", #, $, %, &, ', (, ), *, +, ,, /, :, ;, <, =, >, ?, @, [, \, ], ^, `, {, |, },~


2
Penso che manchino molti caratteri consentiti come, ad esempio, é o ø.
Eric Bloch

Per coprire quei casi non ASCII, dovrebbe includere \ p {L} + come parte del set di caratteri
Kenston Choi

11
Nemmeno le cifre possono essere utilizzate come primo carattere.
Thilo

5

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

Nessuno spazio o due punti. Consente "_" e "-".

Lo useresti al posto della stringa in modo da poter convalidare che il valore è limitato a ciò che è consentito. Si associa bene a certe convenzioni per nome / identificatore come il concetto di django di "lumaca", per esempio.

Do un voto positivo alla persona che [\i-[:]][\c-[:]]*traduce in inglese per noi.


11
Ho aggiunto una risposta che si traduce [\i-[:]][\c-[:]]*in inglese. Vai avanti e vota, come hai promesso;)
jasso
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.