2009-06-16 5 views
0

J'ai du code XML qui a été créé en utilisant un objet XmlDocument en C#.Caractères spéciaux/échappement XML SQL 2005 de System.Xml.XmlDocument.OuterXml

J'insère ensuite les données xml dans une colonne XML dans SQL 2005 en utilisant la méthode XmlDocument.OuterXml pour obtenir le fichier XML brut.

Le problème que j'ai est que le xml contient des caractères spéciaux. A savoir:  C'est parce que le XML est construit à partir de l'entrée de l'utilisateur provenant de diverses sources. Lorsque j'effectue l'insertion, j'obtiens un message d'erreur SQL indiquant l'analyse XML: caractère xml illégal.

CREATE TABLE #MyTable (MyColumn XML) 
INSERT INTO #MyTable VALUES ('<Element>&#x1F;&#x1C;</Element>') 

Msg 9420, niveau 16, état 1, ligne 2

parsing XML: ligne 1, 15 caractères, le caractère xml illégal

quelqu'un peut me diriger dans une direction à la façon dont je peux résoudre ceci?

Il me sera extrêmement difficile de changer quoi que ce soit sur l'objet XmlDocument ou sur le fichier xml lui-même, cependant, je peux changer le mécanisme que j'utilise pour obtenir le XML RAW. Je peux également modifier mes paramètres de base de données si nécessaire.

Répondre

1

Si vous avez un XmlDocument avec des caractères invalides, vous n'avez pas de XML valide. Il n'y a aucun moyen de représenter quoi que ce soit en dessous de U + 0020 autre que tabulation, retour chariot et saut de ligne en XML. Je ne suis pas tout à fait sûr pourquoi, mais c'est XML non valide selon la spécification.

Vous pouvez stocker la brute texte du XML non valide dans la base de données, mais je suppose qu'il ya une raison pour laquelle vous vouliez que ce soit une colonne XML en premier lieu :)

Voulez-vous réellement préserver ce XML invalide? Savez-vous d'où ça vient et si c'est nécessaire? Personnellement, j'essayerais de nettoyer les données dans la mesure du possible.

(BTW, la première pile vidage de données de débordement a eu un problème similaire, il est donc pas seulement vous :)

+0

y at-il un moyen de rendre l'o XmlDocument bject applique les mêmes règles de validation? Ces caractères provenaient d'un utilisateur qui les tapait/les collait dans une zone de texte HTML et TextBox.Text était alors assigné à XmlNode.InnerText. Si le XML est invalide, je suis surpris qu'il ne soit pas tombé en panne à ce stade. –

+0

Jetez un oeil à http://msdn.microsoft.com/en-us/library/56xykaw6.aspx –

+0

Je n'ai pas besoin de conserver les données invalides. Il s'agit de toutes les entrées de l'utilisateur à partir de pages Web et donc pas sûr de la façon dont les caractères d'échappement sont arrivés de toute façon. Je voudrais le nettoyer, j'ai juste besoin d'une solution élégante. J'ai trouvé du code qui supprime les caractères invalides en bouclant toute la chaîne. Cela me semble juste faux, je ne devrais pas coder quels caractères sont valides et lesquels ne le sont pas. –

0

Ceci est possible INSERT INTO #MyTable ('& # de x1f;')

ajouter des espaces maintenant pour plus de clarté

INSERT INTO #MyTable ('< E lement> & amp; # x 1 F; </E lement>')

Questions connexes