12
votes

Java - Comment vérifier si la chaîne est un nom d'élément XML valide?

Connaissez-vous la fonction en Java qui validera une chaîne pour être un bon nom d'élément XML.

formulaire W3Schools:

Les éléments XML doivent suivre ces nommés Règles:

    Les noms
  1. peuvent contenir des lettres, des chiffres et d'autres caractères Les noms
  2. ne peuvent pas commencer par un numéro ou un caractère de ponctuation Les noms
  3. ne peuvent pas démarrer avec les lettres XML (ou XML ou XML, etc.) Les noms
  4. ne peuvent pas contenir d'espaces

    J'ai trouvé d'autres questions proposant des solutions Regex, n'est-ce pas une fonction qui le fait déjà?


0 commentaires

4 Réponses :


4
votes

La production correspondante à partir de la spécification est http://www.w3.org / Tr / xml / # nt-name

Nom :: == Namestartchare Namechar *

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]

Namechar :: = Namestartchar | "-" | "." | [0-9] | # xb7 | [# x0300- # x036f] | [# x203f- # x2040]

une regex pour correspondre est xxx

si vous souhaitez gérer les nomsPaçade de noms, vous devez vous assurer qu'il y a au plus un côlon , donc xxx

(manqué un autre 03GF; modifié à la fois sur 036F)


2 commentaires

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é.




2
votes

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);
}


1 commentaires

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.



2
votes

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 com.sun non public. * 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.

Ceci est le code requis pris à partir du class interne com.sun.org.apache.xerces.internal.util.xmlchar : xxx


1 commentaires

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)