Dans SQL Server, quelle est la meilleure façon de déterminer si une chaîne est un XML valide ou pas?
Un tiers de la composante est de remplir un nvarchar
colonne dans une table avec certaines valeurs. La plupart du temps, il est lisible par l'utilisateur de la chaîne, mais de temps en temps c'est du XML (dans le cas de certaines exceptions internes dans la 3ème partie de la comp).
Comme une solution temporaire (jusqu'à ce qu'ils le réparer et de l'utilisation de la chaîne de toujours), je voudrais analyser les données XML et d'en extraire le message réel.
Environnement: SQL Server 2005, les cordes sont toujours à moins de 1K en taille; il pourrait y avoir quelques milliers de lignes dans cette table.
Je suis tombé sur un couple de solutions, mais je ne suis pas sûr si elles sont assez bonnes:
- Invoquer
sp_xml_preparedocument
stockées proc et l'enrouler autour bloc TRY/CATCH. De vérifier la valeur de retour/poignée. - Écrire en code managé (en C#), encore de la gestion des exceptions et voir si c'est une chaîne valide.
Aucune de ces méthodes semblent efficaces. Je cherchais somethig similaire à ISNUMERIC()
: un ISXML()
fonction. Quel autre meilleur moyen de vérifier la chaîne de caractères?
- Pourquoi, où vous avez 2 solutions, pas suffisant? Ce qui manquait?
- Si la chaîne ne commence pas avec
<
alors je suppose que vous savez qu'il n'est certainement pas le XML. - Je voulais dire "efficace" 🙂 ces 2 solutions ne sonne pas évolutive si le nombre de lignes augmente considérablement.
- Voir la TRY_CONVERT réponse ci-dessous
Vous devez vous connecter pour publier un commentaire.
Peut-être qu'il n'est pas nécessaire de vérifier XML valide. Vous pouvez le vérifier la présence de la
xml
tag aveccharindex
en cas de déclaration et d'en extraire le message d'erreur à l'aide desubstring
.Voici un exemple avec un simplifiée, la chaîne XML mais je pense que vous obtenez l'idée.
Résultat:
Basé sur la accepté de répondre, j'ai créé ceci pour vérifier la validité XML et éventuellement convertir la chaîne d'entrée au format XML (ou extraire les éléments /attributs à partir du XML), parce que je pensais que l' TRY_CONVERT travaille avec succès dans le cas où vous venez de passer en texte brut, ce que je ne m'attendais pas, donc, une autre vérification était nécessaire afin de prévenir la distribution finale au format XML j'ai besoin de travailler dans le cas où la colonne source tient juste un peu de texte (exemple de la ligne 1):
valild><item>valid xml</item>
=valid><item>xml</item>
Juste quelque chose d'être conscient de.Vous pouvez créer un schéma XML et de les utiliser pour valider contre les chaînes de caractères XML.
Voir ici pour plus d'infos : http://msdn.microsoft.com/en-us/library/ms176009.aspx
Voici un exemple:
Exemples:
Msg 6965, Niveau 16, État 1, Ligne 2
Validation XML: contenu non Valide. Attendu élément(s):UserID où l'élément "nom d'utilisateur" a été spécifié. Emplacement: /:Utilisateur[1]/:Nom D'Utilisateur[1]
Msg 6909, Niveau 16, État 1, Ligne 2
Validation XML: nœud de Texte n'est pas autorisé à cet emplacement, le type a été défini avec l'élément de contenu ou avec un contenu simple. Emplacement: /
Je ne sais pas à propos d'une meilleure façon, mais voici un moyen:
Si le XML n'est pas valide, il renvoie une erreur:
Juste pour clarifier, tout ce que vous avez à faire est de voter pour elle:
vs
select cast('foo' as xml)
n'est pasxml
mais jette sans erreur.select cast('foo < bar' as xml)
provoque une erreur.try..catch
dans les fonctions.