IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Développement SQL Server Discussion :

Problème méthode Value du datatype XML


Sujet :

Développement SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Par défaut Problème méthode Value du datatype XML
    Bonjour

    Je reçois via des queues du service broker des messages en xml envoyé par mon serveur biztalk.

    Ces messages sont formattés en Xml, avec un schéma associé.

    Je dois extraire les valeurs de certains noeuds du flux XML pour aller alimenter une table de trace.

    Pour cela, j'utilise la méthode Value du type XML. Le problème est que, malgré une requête XPath valide, le retour est toujous nulle.

    J'ai fini par trouver que c'est la présence de l'attribut xmlns dans le noeud racine qui entrainait le problème.

    Un exemple de bout de code (directement exécutable dans SSMS après copier-coller) pour illustrer mon soucis :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
    declare @myXml XML
    declare @actionGuid uniqueidentifier
    declare @eventName varchar(100)
    declare @RecvMsg nvarchar(max)
    set @RecvMsg = 
    '<MZBEventResponseMessage xmlns="http://XXX.YYY.com/mzb/0/MZBEventResponseMessageSchema">
    <rowguid>b5a5a9bd-7946-05ec-14f1-639152214a0b</rowguid>
    <EventName>AcceptedBySI</EventName>
    <EventState>Ok</EventState>
    </MZBEventResponseMessage>'
     
    set @myXml= Convert(Xml, @RecvMsg, 0)
    set @eventName= @myXml.value('(/MZBEventResponseMessage/EventName)[1]', 'varchar(50)') 
    set @actionGuid = @myXml.value('(/MZBEventResponseMessage/rowguid)[1]', 'uniqueidentifier') 
     
    print isnull(@eventName, '@eventName null')
    print isnull(cast(@actionGuid as varchar(50)), '@actionGuid null')
    me retourne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    @eventName null
    @actionGuid null
    Si, en revanche, j'enlève l'attribut xmlns le problème disparait. Le même exemple avec l'attribut en moins : (toujours copiable-collable directement pour les St Thomas )

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
    declare @myXml XML
    declare @actionGuid uniqueidentifier
    declare @eventName varchar(100)
    declare @RecvMsg nvarchar(max)
    set @RecvMsg = 
    '<MZBEventResponseMessage>
    <rowguid>b5a5a9bd-7946-05ec-14f1-639152214a0b</rowguid>
    <EventName>AcceptedBySI</EventName>
    <EventState>Ok</EventState>
    </MZBEventResponseMessage>'
     
    set @myXml= Convert(Xml, @RecvMsg, 0)
    set @eventName= @myXml.value('(/MZBEventResponseMessage/EventName)[1]', 'varchar(50)') 
    set @actionGuid = @myXml.value('(/MZBEventResponseMessage/rowguid)[1]', 'uniqueidentifier') 
     
    print isnull(@eventName, '@eventName null')
    print isnull(cast(@actionGuid as varchar(50)), '@actionGuid null')
    me retourne bien :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
     AcceptedBySI
    B5A5A9BD-7946-05EC-14F1-639152214A0B
    Je n'arrive pas à trouver comment modifier la syntaxe de mes requêtes XPath pour régler cela.

    Je contourne pour le moment le problème de manière très sale en castant le message dans un varchar (comme dans le bout de code d'illustration) et je traite la chaine pour supprimer l'attribut xmlns puis je recaste le résultat dans un type xml,mais c'est franchement immonde.

    Quelqu'un, un grand boula matari du Xpath, par exemple, a-t-il une solution ?

    Merci par avance. (sachant que on ne peut pas, du moins à court terme, modifier le schéma du message).

  2. #2
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Par défaut
    Bon, mon problème ne semble pas déclencher l'enthousiasme des foules.

    Comme je ne me décide pas à laisser passer ma "verrue" de résolution en prod, je vais passer la procédure en SQLCLR; ainsi ce sera résolu.

    Mais j'aurais bien aimer savoir si il existait une solution T-SQL.

  3. #3
    Expert confirmé
    Avatar de mikedavem
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2005
    Messages
    5 450
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Distribution

    Informations forums :
    Inscription : Août 2005
    Messages : 5 450
    Par défaut
    Bonjour,

    Dès que j'ai un moment, je regarderais votre problème qui m'intéresse

    ++

  4. #4
    Invité de passage
    Profil pro
    Inscrit en
    Août 2010
    Messages
    1
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 1
    Par défaut Declare NameSpace dans requete xpath
    Bonjour, pour régler ce type de problme, il est necessaire d'indiquer le NameSpace. Le code suivant modifié fonctionne correctement.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
    declare @myXml XML(dbo.MZBEventResponseMessageSchema)
    declare @actionGuid uniqueidentifier
    declare @eventName varchar(100)
    declare @RecvMsg nvarchar(max)
    SET @RecvMsg = 
    '<MZBEventResponseMessage xmlns="http://XXX.YYY.com/mzb/0/MZBEventResponseMessageSchema">
    <rowguid>b5a5a9bd-7946-05ec-14f1-639152214a0b</rowguid>
    <EventName>AcceptedBySI</EventName>
    <EventState>Ok</EventState>
    </MZBEventResponseMessage>'
     
    SET @myXml= Convert(Xml, @RecvMsg, 0)
    SET @eventName= @myXml.value('declare namespace ns="http://XXX.YYY.com/mzb/0/MZBEventResponseMessageSchema" ; (/ns:MZBEventResponseMessage/ns:EventName)[1]', 'nvarchar(100)') 
    SET @actionGuid= @myXml.value('declare namespace ns="http://XXX.YYY.com/mzb/0/MZBEventResponseMessageSchema" ; (/ns:MZBEventResponseMessage/ns:rowguid)[1]', 'uniqueidentifier') 
    print isnull(@eventName, '@EventName null')
    print isnull(@actionGuid, '@actionGuid null')
    Voila. En espérant que cela va vous aider

  5. #5
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Par défaut
    Merci !

    Je passe donc en résolu.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. problème pour parser un fichier xml avec XML::Simple
    Par black_code dans le forum Modules
    Réponses: 3
    Dernier message: 30/01/2006, 19h32
  2. Liste déroulante chainée : problème avec value
    Par jpascal dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 20/08/2005, 21h06
  3. Probléme cache avec IE et XML/XSL coté client.
    Par rataflo dans le forum XSL/XSLT/XPATH
    Réponses: 3
    Dernier message: 06/08/2005, 19h06
  4. Réponses: 6
    Dernier message: 08/02/2005, 17h50
  5. problème xsl : inclure une donnée xml dans une balise html
    Par djodjo dans le forum XSL/XSLT/XPATH
    Réponses: 3
    Dernier message: 03/01/2003, 09h24

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo