Connaissez-vous la fonction en Java qui validera une chaîne pour être un bon nom d'élément XML. P>
formulaire W3Schools: p>
Les éléments XML doivent suivre ces nommés Règles: p>
Les noms
- peuvent contenir des lettres, des chiffres et d'autres caractères li> Les noms
- ne peuvent pas commencer par un numéro ou un caractère de ponctuation li> Les noms
- ne peuvent pas démarrer avec les lettres XML (ou XML ou XML, etc.) li> Les noms
- ne peuvent pas contenir d'espaces li> ol> blockQuote>
J'ai trouvé d'autres questions proposant des solutions Regex, n'est-ce pas une fonction qui le fait déjà? P>
4 Réponses :
La production correspondante à partir de la spécification est http://www.w3.org / Tr / xml / # nt-name
Nom :: == Namestartchare Namechar * P>
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- # xeffond] p>
Namechar :: = Namestartchar | "-" | "." | [0-9] | # xb7 | [# x0300- # x036f] | [# x203f- # x2040] p> blockQquote>
une regex pour correspondre est p>
xxx pré> si vous souhaitez gérer les nomsPaçade de noms, vous devez vous assurer qu'il y a au plus un côlon , donc p>
xxx pré> (manqué un autre 03GF; modifié à la fois sur 036F) p> p>
Merci, cela signifie que la règle numéro 3 n'est pas correcte "3. Les noms ne peuvent pas démarrer avec les lettres XML (ou XML ou XML, etc.)".
La réponse est oui et non. "Noms commençant par la chaîne" XML "ou avec une chaîne qui correspondrait à (('x' | 'x') ('M' | 'm') ('L' | 'L')), sont réservés à normalisation dans cette ou future versions de cette spécification. " Donc, c'est un nom valide, mais il est réservé.
Si vous utilisez Xerces XML Parser, vous pouvez utiliser la classe xmlchar (ou xml11charate) Il y a aussi un exemple de code disponible ici a> pour isvalidname () code> méthode , comme ceci: isvalidname code>. p> p>
Nice, ça ressemble exactement à ce que je cherche mais savez-vous pourquoi xmlchar.isvalidname ("XML") retourne vrai? (Question approuvée)
"XML", tel que mesuré de cas insensible, est valide - mais réservé. Vous pouvez venir dans la pratique. Si vous vérifiez que vous vérifiez une entrée, vous souhaiterez peut-être ajouter &&! Nom.tolowercase (). StartSweh ("XML")
Le code requis pour la vérification de la validité du nom consiste en quelques lignes et peut être copié pour éviter une autre dépendance externe. Voir Ma réponse pour plus de détails.
Utiliser les utilitaires ORG.APACHE.XERCES est un bon moyen de partir; Toutefois, si vous avez besoin de coller au code Java qui fait partie de l'API Java standard, le code suivant le fera:
public void parse(String xml) throws Exception {
XMLReader parser = XMLReaderFactory.createXMLReader();
parser.setContentHandler(new DefaultHandler());
InputSource source = new InputSource(new ByteArrayInputStream(xml.getBytes()));
parser.parse(source);
}
Mais soyez conscient que la surcharge d'instanciation d'un XMLReader pour cette tâche est plutôt élevée, surtout si elle est faite à l'aide de la recherche d'usine JAXP. Pas de problème si c'est réutilisé assez souvent, bien sûr.
comme un ajout actuel au réponse acceptée :
au moins au moins Le JDK 1.8 de Oracle (probablement plus âgés aussi) Utilisez l'analyseur XERCES en interne dans le Ceci est le code requis pris à partir du class interne com.sun non public. * Code> packages. Vous ne devez utiliser aucune implémentation de ces classes car elles peuvent changer sans préavis dans les versions futures de la JDK! Cependant, le code requis pour la vérification de la validité du nom d'élément XML est très bien encapsulé et peut être copié à votre propre code. De cette façon, vous pouvez éviter une autre dépendance à une bibliothèque externe. P> com.sun.org.apache.xerces.internal.util.xmlchar Code>: p>
Il ne sera pas copilé avec JDK 11: Erreur: [Erreur] (package com.sun.org.apache.xerces.internal.util est déclaré dans le module Java.xml, qui ne l'exporte pas)