Extraire des champs XML d'un ntext (sql)...

Extraire des champs XML d'un ntext (sql)... - XML/XSL - Programmation

Marsh Posté le 17-03-2007 à 01:39:37    

Hello!
 
Je fais un projet avec SQL 2005 et C# .... et dans la base sql 2005, j'ai des champs "ntext" ou il y a du texte de type XML, par exemple :
 

Code :
  1. <phones>
  2.      <phone type="Office">0434984782</phone>
  3.      <phone type="Home">485774792</phone>
  4. </phones>


 
Comment je peux faire pour récupérer les valeurs "Office" et "0434984782" ?
 
thx, +++

Reply

Marsh Posté le 17-03-2007 à 01:39:37   

Reply

Marsh Posté le 17-03-2007 à 01:48:44    

je dirai programme php

Reply

Marsh Posté le 17-03-2007 à 11:19:53    

ionik a écrit :

je dirai programme php


 
 :lol: lol  :lol:  
 
j'vois pas le rapport!

Reply

Marsh Posté le 18-03-2007 à 07:18:58    

bon, voilà comment j'ai fais :
 

Code :
  1. String s2 = "<PHONES>" +
  2.                                 "<PHONE  Type='Office'>026 294 38 29</PHONE>" +
  3.                                 "<PHONE  Type='House'>021 294 31 31</PHONE>" +
  4.                             "</PHONES>";
  5.                 XmlTextReader reader = new XmlTextReader(new System.IO.StringReader(s2));
  6.                 /* STRING */
  7.                 while (reader.Read())
  8.                 {
  9.                     switch (reader.NodeType)
  10.                     {
  11.                         //case XmlNodeType.Element:
  12.                         //    string sNameElement = reader.Value;
  13.                         //    Console.WriteLine(sNameElement);
  14.                         //    break;
  15.                         //case XmlNodeType.EndElement:
  16.                         //    string sNameEndElement = reader.Value;
  17.                         //    Console.WriteLine(sNameEndElement);
  18.                         //    break;
  19.                         case XmlNodeType.Attribute:
  20.                             string sNameAttribute = reader.ReadString();
  21.                             Console.WriteLine(sNameAttribute);
  22.                             break;
  23.                         case XmlNodeType.Text:
  24.                             string sNameText = reader.Value;
  25.                             Console.WriteLine(sNameText);
  26.                             break;
  27.                         default:
  28.                             break;
  29.                     }
  30.                 }


 
++

Reply

Marsh Posté le 18-03-2007 à 07:22:30    

du XML dans une base sql, yeay le mélange [:bien]


---------------
Me: Django Localization, Yogo Puzzle, Chrome Grapher, C++ Signals, Brainf*ck.
Reply

Marsh Posté le 26-03-2007 à 17:40:21    

0x90 a écrit :

du XML dans une base sql, yeay le mélange [:bien]


 
pas trop à la page toi :D
 
c'est fini les années 50 hein  :lol:  
 
non sérieusement, c'est la classe l'utilisation du XML dans une BDD... ca permet d'avoir une BDD vachement souple et ou on peut tout de même faire des requetes complexes (je parle de sql 2005 là hein...)! Bon moi je stocke le XML dans un nText car je dois synchroniser une BDD sql 2005 et sql compact edition... et la compact edition ne gère pas le XML, donc voilà :(. Mais au moins ca me permettra de facilement me mettre à jour qd la version compact le supportera.

Message cité 1 fois
Message édité par le_duc le 26-03-2007 à 17:41:05
Reply

Marsh Posté le 26-03-2007 à 17:47:18    

déjà, il y a un type "xml" dans SQL Server 2005.
Il est fait pour ça. A mon avis, ce sera plus simple.
 
Ensuite, il y a une documentation truffée d'exemples...

Reply

Marsh Posté le 26-03-2007 à 17:58:05    

Déjà, ça ça marche :
 

Code :
  1. select id, cast([text] as xml).query('/element/val')
  2. from testxml


=> tu récupères sous la forme xml le contenu des éléments "val" de ton champ ntext (ici, il s'appelle "text" )
 
ensuite, faut trouver comment mettre le truc dans un filtre, j'y arrive pas, et la msdn rame trop. il est l'heure d'aller dodoer :o

Reply

Marsh Posté le 26-03-2007 à 18:00:40    

Reply

Marsh Posté le 26-03-2007 à 20:01:29    

Tout ce que je peux dire, c'est que c'est une merde infâme à utiliser mais bon...
 


CREATE TABLE [dbo].[testxml](
 [id] [numeric](18, 0) NOT NULL,
 [nom] [varchar](50) NOT NULL,
 [data] [xml] NOT NULL,
 CONSTRAINT [PK_testxml] PRIMARY KEY CLUSTERED  
(
 [id] ASC
))
go
 
insert into testxml (id, nom, data) values (1, 'toto', '<phones><phone type="mobile">0612345678</phone><phone type="home">0123456789</phone></phones><emails><email type="perso">toto@hotmail.com</email></emails>');
insert into testxml (id, nom, data) values (2, 'titi', '<phones><phone type="mobile">0687654321</phone></phones><emails><email type="perso">titi@hotmail.fr</email><email type="work">titi@worldcompagny.com</email></emails>');
insert into testxml (id, nom, data) values (3, 'tata', '<phones><phone type="home">0234567891</phone></phones><emails><email type="work">myoffice@hotmail.com</email></emails>');
insert into testxml (id, nom, data) values (4, 'tutu', '<phones><phone type="home">0345678912</phone></phones><emails><email type="perso">tutu@gmail.com</email></emails>');
 
-- Récupération des numéros de téléphone "home" des membres ayant une adresse perso chez Hotmail
select testxml.nom, tel.phone.value('.', 'varchar(10)'), cou.email.value('.', 'varchar(255)')
from testxml
outer apply testxml.data.nodes('/emails/email') as cou(email)
outer apply testxml.data.nodes('/phones/phone[@type="home"]') as tel(phone)
where cou.email.value('./@type', 'varchar(10)') = 'perso'
and cou.email.value('.', 'varchar(255)') like '%@hotmail.%'


 
Résultat :


nom                                                            
-------------------------------------------------- ---------- ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
toto                                               0123456789 toto@hotmail.com
titi                                               NULL       titi@hotmail.fr
 
(2 row(s) affected)

Reply

Marsh Posté le 26-03-2007 à 20:01:29   

Reply

Marsh Posté le 29-03-2007 à 21:15:30    

ouais mais comme je l'ai dit, je ne peux pas utiliser le type XML dans SQL 2005...car je synchronise cette base avec une base SQL Compact Edition qui elle ne supporte pas le type XML! Je suis donc obligé d'utiliser un type NTEXT....
 
Sinon pour le format XML, y'a LINQ qui va  bientôt sortir et qui sera vachement intéressant (plus spécifiquement XLINQ pour le xml!).

Reply

Marsh Posté le 30-03-2007 à 00:51:14    

le_duc a écrit :

pas trop à la page toi :D
 
c'est fini les années 50 hein  :lol:  
 
non sérieusement, c'est la classe l'utilisation du XML dans une BDD... ca permet d'avoir une BDD vachement souple et ou on peut tout de même faire des requetes complexes (je parle de sql 2005 là hein...)! Bon moi je stocke le XML dans un nText car je dois synchroniser une BDD sql 2005 et sql compact edition... et la compact edition ne gère pas le XML, donc voilà :(. Mais au moins ca me permettra de facilement me mettre à jour qd la version compact le supportera.


 
Le modèle relationnel subsume le modèle arborescent de l'XML, je vois pas en quoi tasser du XML textuel dans une colonne est signe de modernité ou en quoi ça améliore la souplesse d'utilisation [:spamafote]


---------------
Me: Django Localization, Yogo Puzzle, Chrome Grapher, C++ Signals, Brainf*ck.
Reply

Marsh Posté le 30-03-2007 à 09:31:44    

cast(monchamptextalacon as xml)
 
spa compliqué :spamafote:

Reply

Marsh Posté le 30-03-2007 à 09:36:02    

0x90 a écrit :

Le modèle relationnel subsume le modèle arborescent de l'XML, je vois pas en quoi tasser du XML textuel dans une colonne est signe de modernité ou en quoi ça améliore la souplesse d'utilisation [:spamafote]


+100
 
c'est surtout le meilleurs moyen de goretiser son application, faire un truc impossible à maintenir, car non réfléchit à la base.

Reply

Marsh Posté le 31-03-2007 à 15:42:32    

MagicBuzz a écrit :

+100
 
c'est surtout le meilleurs moyen de goretiser son application, faire un truc impossible à maintenir, car non réfléchit à la base.


 
bah tout dépend de l'utilisation!!!!
 
perso dans mon applic j'ai une table "Personne" et à l'intérieur de cette table, j'aurais bien fait des champs XML pour les les site Web de la personne et pour ses numéros de téléphones!!
 
Pasque pour gérer en relationnel plusieurs numéros de téléphone et sites web pour une personne (qui sont qd meme des renseignements de basse importance (enfin ca dépend de l'applic denouveau, masi dans mon cas en tout cas!), ca devient vite un modèle assez "lourd" pour pas grand chose!

Reply

Marsh Posté le 31-03-2007 à 15:47:34    

MagicBuzz a écrit :

cast(monchamptextalacon as xml)
 
spa compliqué :spamafote:


 
ouais...le problème c'est qu'il faut que je regarde pour intégrer ca au services de synchronisation ADO.NET et comme aucune requete n'est faite sur ma base de donnée principale (sauf synchronisation des données), ca me faisait chier de chercher comment faire :D

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed