2017-09-11 1 views
0

disons que j'ai requête SQL comme ceci:requête SQL n'exécute pas à cause de caractères échappées

SELECT column_name FROM table WHERE columnid <= 5 

défini dans orm.xml comme ceci:

<named-query> 
    <query> 
    sql query 
    </query> 
</named-query> 

Environnement a déclaré que le XML est pas bien formé, à cause du caractère <. Alors je googlé pour l'explication et je trouve que je dois échapper les caractères comme dans l'exemple suivant

< = &lt , > = &gt 

Mais quand j'excaped ces caractères, la requête ne s'exécute pas. Ce n'est pas valide, à cause de l'évasion. Avez-vous s'il vous plaît une idée de comment résoudre ce problème ou une solution de contournement?

+0

Comment trouvez-vous une requête de xml? vous devez décoder HTTP à <<. Quelque chose comme ici. Voir l'exemple dans le lien et cliquez sur décoder. https://codebeautify.org/html-decode-string – Amit

+2

'>' avec un point-virgule. L'utilisation des fonctions normales de l'API XML, paramétrée et obtenue, la cacherait. –

+0

Eh bien, je ne sais pas exactement comment je ramasse des requêtes, parce que ce fichier orm.xml n'est pas mappé n'importe où ... im travaillant avec le printemps et hiberner, donc il doit le faire lui-même en quelque sorte – madStudent

Répondre

0

Je ne sais pas si cela est encore ouvert, mais - au moins - il est sans réponse:

Vous ne devriez pas penser XML comme une chaîne avec fantaisie des caractères supplémentaires. Mettre le contenu dans le XML a quelques règles et valeurs de lecture de XML a également quelques règles. Vous pouvez facilement créer quelque chose qui ressemble comme XML au niveau de la chaîne, mais - si votre xml n'est pas valide - vous aurez des problèmes.

Les exceptions les plus importantes sont - évidemment! - <, > and &, ce qui perturberait le balisage, sinon échappé.

DECLARE @xml XML=N'<root>SELECT column_name FROM table WHERE columnid &lt;= 5</root>'; 
SELECT @xml.value(N'(/root/text())[1]',N'nvarchar(max)'); 

Vous constaterez que le caractère échappé est reconverti implicitement. Mais vous devez lire le XML avec un outil approprié!. Si vous lisez le XML avec des méthodes de chaîne (comme substring), vous devrez vous assurer que vous vous échapperez de nouveau.

Il y a - pas recommandé - solution de contournement: Vous pouvez utiliser un CDATA -section comme ici:

DECLARE @xml XML=N'<root><![CDATA[SELECT column_name FROM table WHERE columnid <= 5]]></root>'; 
SELECT @xml.value(N'(/root/text())[1]',N'nvarchar(max)'); 

Cela vous permet de placer du texte dans le fichier XML qui sera prendre en l'état. Mais cela est obsolète et n'est pas pris en charge directement dans SQL Server (Eh bien, il y a FOR XML EXPLICIT, qui est lui-même périmé). SQL-Server va effectivement stocker les éléments ci-dessus sans CDATA comme chaîne échappée automatiquement. Sémantiquement, c'est pareil ...