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

Requêtes PostgreSQL Discussion :

remplacer un paragraphe (xml)


Sujet :

Requêtes PostgreSQL

  1. #1
    Invité
    Invité(e)
    Par défaut remplacer un paragraphe (xml)
    Bonjour,

    J'ai une base de données sous postgres (les réponses sur les autres sgbd peuvent aussi être interessante), un champ stocke des informations en xml.
    Je souhaite remplacer (et/ou ajouter, supprimer) un certain nombre de valeurs que l'on peut définir comme des paragraphes entre plusieurs balises.

    les requêtes de type :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    UPDATE matable 
    SET colonne = replace(colonne,'paragraphe recherché','nouveau paragraphe')
    WHERE condition;
    ne fonctionne pas....

    Pour plus de précision, mon paragraphe est de la forme :

    <balise1>
    
    <balise2>
    blabla
    </balise2>
    <balise2b>
    blablabla
    </balise2b>
    </balise1>
    Les éléments de mise en forme du xml doivent y être pour quelque chose...

    J'ai testé seulement la recherche, et pour avoir un résultat valable j'ai du transformer mon paragraphe de la sorte :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Search * from matable 
    where colonne like '%<balise1>%<balise2>%blabla%</balise2>%<balise2b>%blablabla%</balise2b>%</balise1>%'
    J'ai alors testé mon remplacer de la sorte

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    UPDATE matable 
    SET colonne = replace(colonne,'<balise1>%<balise2>%blabla%</balise2>%<balise2b>%blablabla%</balise2b>%</balise1>','test')
    WHERE condition;
    Et je crois que c'est gagné (Query returned successfully: 1 row affected) mais il ne m'a rien modifié... ce que je ne comprend pas trop.

    En plus il reste ensuite la difficulté de la mise en forme du nouveau paragraphe.

    Quelqu'un a-t-il une idée ?
    Dernière modification par al1_24 ; 29/08/2011 à 10h58.

  2. #2
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 761
    Points : 52 547
    Points
    52 547
    Billets dans le blog
    5
    Par défaut
    PostGreSQL ne dispose pas de fonction de mise à jour des données XML contrairement à IBM DB2, Oracle ou SQL Server.
    Pour la liste des fonctions disponible sous PostGreSQL pour gérer les documents XML, voir :
    http://wiki.postgresql.org/wiki/XML_Support
    http://developer.postgresql.org/pgdo...tions-xml.html

    En conséquence, avec PG, vous devez récrire tout le document XML par un traitement externe et le réinjecter avec un UPDATE.

    Par exemple sous MS SQL Server il suffit de faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    UPDATE MaTable 
    SET MaColonneXML = MaColonneXML.modify('replace value of (/root/item/@value)[1] with sql:variable("@value")');
    Pour aller remplacer la valeur du premier attribut value dans le path /root/item par le contenu de la variable @value.

    Pour avoir un aperçu des possibilités de manipulation XML des SGBDR, lire le livre de Jim Melton (rapporteur de la norme SQL au comité de normalisation) :
    [ame="http://www.amazon.fr/Querying-Xml-Xquery-Xpath-Context/dp/1558607110"]Querying Xml: Xquery, Xpath, And Sql/xml in Context: Amazon.fr: Jim Melton, Stephen Buxton: Livres anglais et ?trangers@@AMEPARAM@@http://ecx.images-amazon.com/images/I/41ltc3KRjNL.@@AMEPARAM@@41ltc3KRjNL[/ame]

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  3. #3
    Invité
    Invité(e)
    Par défaut
    Merci pour la réponse.

    Et si mon paragraphe n'est pas du xml, il n'y aurait pas de solution (tout SGBD confondus) ?

    Concernant SQL Server, apparemment le native xml support est dans toutes les versions, je vais donc pouvoir tester avec SQLServer Express.

    Voici un petit extrait des derniers niveaux de mon xml (le <gmd:MD_DigitalTransferOptions> est inclus dans 6 autres niveaux).

    <gmd:MD_DigitalTransferOptions>
    <gmd:unitsOfDistribution>
    <gco:CharacterString xmlns:gco="http://www.isotc211.org/2005/gco">Département</gco:CharacterString>
    </gmd:unitsOfDistribution>
    <gmd:transferSize>
    <gco:Real xmlns:gco="http://www.isotc211.org/2005/gco">500.0</gco:Real>
    </gmd:transferSize>
    <gmd:onLine>
    <gmd:CI_OnlineResource>
    <gmd:linkage>
    <gmd:URL>adresse web service</gmd:URL>
    </gmd:linkage>
    <gmd:protocol>
    <gco:CharacterString xmlns:gco="http://www.isotc211.org/2005/gco">WWW:LINK-1.0-http--link</gco:CharacterString>
    </gmd:protocol>
    <gmd:name>
    <gco:CharacterString xmlns:gco="http://www.isotc211.org/2005/gco">GeoService</gco:CharacterString>
    </gmd:name>
    </gmd:CI_OnlineResource>
    </gmd:onLine>

    </gmd:MD_DigitalTransferOptions>

    Si je veux changer la valeur "adresse web service" je vais avoir quelque chose du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    UPDATE MaTable 
    SET MaColonneXML = MaColonneXML.MODIFY('replace value of (/root/.../<gmd:MD_DigitalTransferOptions>/<gmd:onLine>/<gmd:CI_OnlineResource>/<gmd:linkage>/<gmd:URL>) with ("new adress")');
    Mais si dans ce paragraphe, je veux ajouter 2 autres champs <gmd:online> (avec les balises imbriquées - tout ce qui est en rouge) je vais devoir déterminer auparavant la structure des balises imbriquées (l'exemple que j'ai donné est une simplification)...

    Cela me semble assez complexe dans mon cas, je compte faire un script pour simplifier des modifications groupées sur des données après un harvesting. Je vais jeter un oeil du côté des ETL.
    Dernière modification par al1_24 ; 05/09/2011 à 10h18.

Discussions similaires

  1. [Débutant] Remplacer bookmark open xml
    Par pitite dans le forum VB.NET
    Réponses: 0
    Dernier message: 27/03/2012, 21h56
  2. Réponses: 22
    Dernier message: 27/08/2008, 14h35
  3. remplacer chaine tag xml
    Par falco- dans le forum Langage
    Réponses: 4
    Dernier message: 22/10/2007, 14h58
  4. [XML] Comment remplacer la valeur de la balise ?
    Par laclac dans le forum Langage
    Réponses: 4
    Dernier message: 19/08/2005, 15h10
  5. Remplacer Terme d'un fichier XML
    Par proner dans le forum Format d'échange (XML, JSON...)
    Réponses: 8
    Dernier message: 24/06/2004, 16h59

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