2013-04-14 3 views
6

Je suis en train d'insérer la chaîne suivante dans un champ xml sqlcaractère xml illégal sur SQL Insérer

<?xml version="1.0" encoding="UTF-8"?> 
<Response> 
    <Ip>x.x.x.x</Ip> 
    <CountryCode>CA</CountryCode> 
    <CountryName>Canada</CountryName> 
    <RegionCode>QC</RegionCode> 
    <RegionName>Québec</RegionName> 
    <City>Dorval</City> 
    <ZipCode>h9p1j3</ZipCode> 
    <Latitude>45.45000076293945</Latitude> 
    <Longitude>-73.75</Longitude> 
    <MetroCode></MetroCode> 
    <AreaCode></AreaCode> 
</Response> 

Le code d'insertion ressemble:

INSERT 
    INTO Traffic(... , xmlGeoLocation, ...) 
    VALUES (
     ... 
     <!--- 
     <cfqueryparam CFSQLType="cf_sql_varchar" value="#xmlGeoLocation#">, 
     ---> 
     '#xmlGeoLocation#', 

     ... 
     ) 

Deux mauvaises choses arrivent:

  1. Le Québec se transforme en Québec

  2. je reçois une erreur disant [Macromedia][SQLServer JDBC Driver][SQLServer]XML parsing: line 8, character 16, illegal xml character

MISE À JOUR:

Le flux de test entrant est la plupart du temps des caractères simples d'octets.

L'é est un caractère de deux octets. En C3A9 particulier

Aussi je n'ai pas de contrôle sur le flux XML entrant

+1

Le serveur I * think * sql utilise l'encodage utf-16 et la déclaration 'utf-8' dans le fichier xml explique pourquoi il échoue. FWIW, si vous supprimez complètement la déclaration 'encoding', ou si vous la remplacez par' encoding = "UTF-16" 'l'insertion réussit dans CF10, avec le paramètre" Activer les caractères ASCII élevés ... "activé. (Changer l'encodage de la chaîne n'a aucun effet.) Cependant, je ne sais pas si cela a des effets secondaires négatifs. – Leigh

+0

Note, l'encodage des caractères est * pas * mon fort ;-) Mon commentaire ci-dessus est basé sur quelques tests rapides seulement. Ce n'est pas une réponse solide, mais j'espère que cela pourrait vous aider à vous orienter dans la bonne direction. – Leigh

+0

Comment recevez-vous le XML? J'ai l'impression que vous ne dites pas aux FC que c'est de l'UTF-8. –

Répondre

1

Jetez un oeil à ce link de W3, il me dit que:

In HTML, there is a list of some built-in character names like &eacute; for é but XML does not have this. In XML, there are only five built-in character entities: &lt; , &gt; , &amp; , &quot; and &apos; for <, >, &, " and ' respectively. You can define your own entities in a Document Type Definition, or you can use any Unicode character (see next item).

In HTML, there are also numeric character references, such as &#38; for &. You can refer to any Unicode character, but the number is decimal, whereas in the Unicode tables the number is usually in hexadecimal. XML also allows hexadecimal references: &#x26; for example.

Cela m'amène à croire que, &#xE9; pourrait fonctionner pour un caractère é.

également les informations à ce link de Microsoft indique que:

SQLXML 4.0 relies upon the limited support for DTDs provided in SQL Server. SQL Server allows for an internal DTD in xml data type data, which can be used to supply default values and to replace entity references with their expanded contents. SQLXML passes the XML data "as is" (including the internal DTD) to the server. You can convert DTDs to XML Schema (XSD) documents using third-party tools, and load the data with inline XSD schemas into the database.

Mais tout cela ne vous aidera pas si vous n'avez pas de contrôle sur le flux XML entrant. Je doute qu'il soit possible d'enregistrer un é (ou n'importe quel caractère spécial à l'exception des entités de caractères intégrées mentionnées ci-dessus) dans un document XML dans un champ XML SQL Server, sans ajouter de DTD ou remplacer le caractère par sa contrepartie de référence hexadécimale. Dans les deux cas, vous devrez pouvoir modifier le code XML avant qu'il ne pénètre dans la base de données.

Juste un exemple rapide pour tous ceux qui veulent descendre le "ajout d'une DTD" route.

Voici comment ajouter une DTD interne dans un fichier xml qui déclare une entité pour un caractère é:

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE root [<!ENTITY eacute "&#233;">]> 
<root> 
    <RegionName>Qu&eacute;bec</RegionName> 
</root> 

Si vous allez here et effectuez une recherche sur la page « Ctrl + F » pour « eacute », vous finissez dans une liste avec des exemples pour d'autres caractères que vous pourriez simplement copier et coller dans votre propre DTD interne.

Modifier

Vous pouvez ajouter toutes les entités de cours car ils sont spécifiées au link ci-dessus: <!ENTITY eacute "&#233;"><!ENTITY .. // Next entity>, ou tout simplement les copier de ce file. Je comprends que l'ajout d'une DTD interne à chaque fichier XML que vous ajoutez à la base de données n'est pas une bonne idée. Je serais intéressé de savoir si l'ajouter pour 1 fichier résout votre problème si.

+0

Je suis préoccupé par ce qui arrive quand le prochain caractère spécial arrive –

+0

J'ai édité la réponse pour répondre à votre commentaire, ce n'est pas vraiment un solution, mais je me demande si cela vous permet d'insérer le XML avec le caractère spécial. –

+0

Votre solution résout la question qui a été posée, mais j'ai vraiment besoin d'une solution générale –

1

Essayez de changer ceci:

<RegionName>Québec</RegionName> 

à:

<RegionName><![CDATA[Québec 
]]></RegionName> 
+1

Je ne contrôle pas le flux xml entrant –

9

Je vais enlever l'en-tête ...

Je vais avoir le même problème avec une petite chose drôle d'apostrophe. Je pense que le problème est qu'au moment où la chaîne est convertie en XML, ce n'est plus UTF-8, mais le serveur sql essaie d'utiliser l'en-tête pour le décoder. Si c'est VARCHAR, c'est dans l'encodage du client. Si c'est NVARCHAR, c'est UTF-16. Voici quelques variantes que j'ai testé:

SQL (varchar, UTF-8):

SELECT CONVERT(XML,'<?xml version="1.0" encoding="UTF-8"?><t>We’re sorry</t>') 

Erreur:

XML parsing: line 1, character 44, illegal xml character 

SQL (nvarchar, UTF-8):

SELECT CONVERT(XML,N'<?xml version="1.0" encoding="UTF-8"?><t>We’re sorry</t>') 

Erreur: Analyse XML: ligne 1, caractère 38, impossible de changer l'encodage

SQL (varchar, UTF-16)

SELECT CONVERT(XML,'<?xml version="1.0" encoding="UTF-16"?><t>We’re sorry</t>') 

Erreur:

XML parsing: line 1, character 39, unable to switch the encoding 

SQL (nvarchar, UTF-16)

SELECT CONVERT(XML,N'<?xml version="1.0" encoding="UTF-16"?><t>We’re sorry</t>') 

Travaillé!

+0

Aussi travaillé! Merci pour la solution. –

+0

En raison de workflow forcé nous avons utilisé les principes de votre réponse et remplacé l'en-tête après l'avoir reçu comme un varchar (max) comme ceci @webtemp = REPLACE (@webtemp, ' ',' '). Cela pourrait bien sûr nécessiter une adaptation. Cela a fonctionné. –

Questions connexes