Annonce
Pour sa 21ème année, l’association GeoRezo a toujours besoin de vous !
10€ = 1 mois de frais bancaires ; 15€ = 12 mois de nom de domaine ; 30€ = 1 semaine de location des serveurs …
Retrouver nos membres bienfaiteurs
#1 Wed 13 November 2024 11:28
- image95
- Participant assidu
- Date d'inscription: 6 Sep 2014
- Messages: 257
Postgresql : extraction de valeur au sein d'un champ XML
Bonjour,
Je travaille avec postgresql 14.
J'ai une table 'metadata' avec 2000 enregistrements. Au sein de cette table, il y a notamment un champ 'id' et un champ 'data_c' contenant du XML.
Mon but serait de pouvoir extraire pour tous les enregistrements les valeurs du 'cit:name' que je mets volontairement en gras ci dessous. Je colle un extrait du xml ci dessous :
<cit:CI_Responsibility>
<cit:role>
<cit:CI_RoleCode codeList="http://standards.iso.org/iso/19115/resources/Codelists/cat/codelists.xml#CI_RoleCode" codeListValue="owner" />
</cit:role>
<cit:party>
<cit:CI_Organisation>
<cit:name>
<gco:CharacterString>Agence de l'Eau Artois-Picardie</gco:CharacterString>
Lorsque je fais un test :
Code:
SELECT id, unnest(xpath('./cit:name/text()', data_c::xml) AS organism FROM public.metadata;
j'obtiens
Code:
ERROR: syntax error at or near "AS" LINE 1: ...LECT id, (xpath('./cit:name/text()', data_c::xml) AS organis... ^ SQL state: 42601 Character: 53
Si une personne pense pouvoir m'aider ? Un grand merci.
Dernière modification par image95 (Wed 13 November 2024 11:39)
Hors ligne
#2 Wed 13 November 2024 12:26
- Nicolas Ribot
- Membre
- Lieu: Toulouse
- Date d'inscription: 9 Sep 2005
- Messages: 1554
Re: Postgresql : extraction de valeur au sein d'un champ XML
Bonjour
Il faut fermer une parenthèse apres "...::xml) " je pense:
::xml))
Pour écrire le SQL, je vous conseille d'utiliser un client qui affiche les ouvertures/fermetures de blocs (comme les parenthèses, les crochets, etc) comme par ex pgadmin, dbeaver, ou mieux IntelliJ
En général les messages d'erreurs SQL sont clairs: là PG vous dit qu'il y a une erreur de syntaxe juste avant AS
Nicolas
Hors ligne
#3 Wed 13 November 2024 14:43
- image95
- Participant assidu
- Date d'inscription: 6 Sep 2014
- Messages: 257
Re: Postgresql : extraction de valeur au sein d'un champ XML
Bonjour,
Merci. En effet. je n'i plus de message d'erreur désormais. Mais les valeurs n'apparaissent pas dans la colonne. Ma nouvelle requete SQL est :
Code:
SELECT id, xpath('/contact/CI_Responsability/party/CI_Organisation/name/CharacterString/text()', CAST(data_c AS XML)) AS organisation_name FROM public.metadata;
Et voici ce que j'obtiens (pas de valeurs récupérées) :
"id" "organisation_name"
16410 "[]"
16411 "[]"
16412 "[]"
16413 "[]"
16414 "[]"
16415 "[]"
16416 "[]"
16423 "[]"
16425 "[]"
16426 "[]"
16427 "[]"
16435 "[]"
2250 "[]"
16587 "[]"
16588 "[]"
Dernière modification par image95 (Wed 13 November 2024 14:44)
Hors ligne
#4 Wed 13 November 2024 15:17
- Nicolas Ribot
- Membre
- Lieu: Toulouse
- Date d'inscription: 9 Sep 2005
- Messages: 1554
Re: Postgresql : extraction de valeur au sein d'un champ XML
Bonjour,
Vous pouvez demander en xpath tous les élements d'un certain tag, par exemple:
Code:
with xml_data as ( select 1 as id, $$ <CI_Responsibility> <role> <CI_RoleCode codeList="http://standards.iso.org/iso/19115/resources/Codelists/cat/codelists.xml#CI_RoleCode" codeListValue="owner" /> </role> <party> <CI_Organisation> <name> <CharacterString>Agence de l'Eau Artois-Picardie</CharacterString> </name> </CI_Organisation> <CI_Organisation> <name> <CharacterString>Agence de l'Eau Seine Normandie</CharacterString> </name> </CI_Organisation> <CI_Organisation> <name> <CharacterString>Agence de l'Eau Adour Garonne</CharacterString> </name> </CI_Organisation> </party> </CI_Responsibility> $$::xml as doc ) select id, unnest(xpath('//CharacterString/text()', doc)) as orga_name from xml_data; +--+-------------------------------+ |id|orga_name | +--+-------------------------------+ |1 |Agence de l'Eau Artois-Picardie| |1 |Agence de l'Eau Seine Normandie| |1 |Agence de l'Eau Adour Garonne | +--+-------------------------------+
Nicolas
Hors ligne
#5 Wed 13 November 2024 15:37
- tumasgiu
- Membre
- Lieu: Ajaccio
- Date d'inscription: 5 Jul 2010
- Messages: 1161
Re: Postgresql : extraction de valeur au sein d'un champ XML
Bonjour,
je crois qu'il y a une erreur de typo :
CI_Responsability dans votre requête xpath, CI_Responsibility dans votre xml.
Dernière modification par tumasgiu (Wed 13 November 2024 15:38)
Hors ligne
#6 Wed 13 November 2024 15:47
- image95
- Participant assidu
- Date d'inscription: 6 Sep 2014
- Messages: 257
Re: Postgresql : extraction de valeur au sein d'un champ XML
Merci pour vos réponses. Afin d'etre plus clair et complet, je me permets de coller l'intégralité de mon contenu XML jusqu'à la balise pour laquelle j'aimerais pouvoir récupérer les valeurs de mes 2000 enregistrements. J'aimerais pouvoir récupérer les infos situées au niveau de :
Code:
<gmd:organisationName> <gco:CharacterString>SANDRE</gco:CharacterString>
Ci dessous le contenu XML jusqu'à la balise d'intéret :
Code:
<gmd:MD_Metadata xmlns:gmd="http://www.isotc211.org/2005/gmd" xmlns:gco="http://www.isotc211.org/2005/gco" xmlns:gml="http://www.opengis.net/gml/3.2" xmlns:gts="http://www.isotc211.org/2005/gts" xmlns:geonet="http://www.fao.org/geonetwork" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.isotc211.org/2005/gmd http://schemas.opengis.net/csw/2.0.2/profiles/apiso/1.0.0/apiso.xsd"> <gmd:fileIdentifier> <gco:CharacterString>1f5b7076-5bff-4394-8c7e-691a047e2af5</gco:CharacterString> </gmd:fileIdentifier> <gmd:language> <gco:CharacterString>fre</gco:CharacterString> </gmd:language> <gmd:characterSet> <gmd:MD_CharacterSetCode codeListValue="utf8" codeList="http://standards.iso.org/iso/19139/resources/gmxCodelists.xml#MD_CharacterSetCode" /> </gmd:characterSet> <gmd:parentIdentifier> <gco:CharacterString>3409c9c3-9836-43be-bac3-b110c82b3a25</gco:CharacterString> </gmd:parentIdentifier> <gmd:hierarchyLevel> <gmd:MD_ScopeCode codeListValue="dataset" codeList="http://standards.iso.org/iso/19139/resources/gmxCodelists.xml#MD_ScopeCode" /> </gmd:hierarchyLevel> <gmd:hierarchyLevelName> <gco:CharacterString>dataset</gco:CharacterString> </gmd:hierarchyLevelName> <gmd:contact> <gmd:CI_ResponsibleParty> <gmd:individualName gco:nilReason="missing"> <gco:CharacterString /> </gmd:individualName> <gmd:organisationName> <gco:CharacterString>SANDRE</gco:CharacterString> </gmd:organisationName>
Hors ligne
#7 Wed 13 November 2024 16:05
- Nicolas Ribot
- Membre
- Lieu: Toulouse
- Date d'inscription: 9 Sep 2005
- Messages: 1554
Re: Postgresql : extraction de valeur au sein d'un champ XML
Un document xml n'est parsable que s'il est complet, pas juste le début du doc.
Vous pouvez soit utiliser xpath sur un doc xml complet et valide dans PG, ou utiliser des fonctions de recherche style regex sur une colonne text, le doc xml n'a pas à être valide dans ce cas.
Je vous conseillerais de faire avec xpath et dans votre cas, il faut je pense déclarer les namespaces dans la fonction xpath (https://www.postgresql.org/docs/current … SING-XPATH).
Un path du type "//gmd:organisationName/gco:CharacterString/text()" devrait extraire tous les textes pour tous les tags CharacterString enfants d'un tag organisationName, peu importe leur niveau d'imbrication (//)
(mais bon, je suis nul en xpath donc pas sûr Il y a des tutos bien faits sur xpath pour comprendre la navigation et les accesseurs)
Ils viennent d'un service OGC du Sandre ces XML ? Vous avez la source d'un doc complet ?
Nicolas
Hors ligne
#8 Wed 13 November 2024 16:20
- image95
- Participant assidu
- Date d'inscription: 6 Sep 2014
- Messages: 257
Re: Postgresql : extraction de valeur au sein d'un champ XML
Un grand merci pour votre aide. Il n'y a pas plus novice que moi sur ce sujet. Je découvre xpath et la manipulation/extraction d'info xml depuis une bdd postgresql. Je vais donc suivre vos conseils. Ces xml viennent du catalogue de l'ofb. Il peut y avoir des fiches 'locales' et des fiches moissonnées. Je vous partage un fichier xml complet si besoin :
Code:
<?xml version="1.0" encoding="UTF-8"?> <mdb:MD_Metadata xmlns:mdb="http://standards.iso.org/iso/19115/-3/mdb/2.0" xmlns:cat="http://standards.iso.org/iso/19115/-3/cat/1.0" xmlns:gfc="http://standards.iso.org/iso/19110/gfc/1.1" xmlns:cit="http://standards.iso.org/iso/19115/-3/cit/2.0" xmlns:gcx="http://standards.iso.org/iso/19115/-3/gcx/1.0" xmlns:gex="http://standards.iso.org/iso/19115/-3/gex/1.0" xmlns:lan="http://standards.iso.org/iso/19115/-3/lan/1.0" xmlns:srv="http://standards.iso.org/iso/19115/-3/srv/2.1" xmlns:mas="http://standards.iso.org/iso/19115/-3/mas/1.0" xmlns:mcc="http://standards.iso.org/iso/19115/-3/mcc/1.0" xmlns:mco="http://standards.iso.org/iso/19115/-3/mco/1.0" xmlns:mda="http://standards.iso.org/iso/19115/-3/mda/1.0" xmlns:mds="http://standards.iso.org/iso/19115/-3/mds/2.0" xmlns:mdt="http://standards.iso.org/iso/19115/-3/mdt/2.0" xmlns:mex="http://standards.iso.org/iso/19115/-3/mex/1.0" xmlns:mmi="http://standards.iso.org/iso/19115/-3/mmi/1.0" xmlns:mpc="http://standards.iso.org/iso/19115/-3/mpc/1.0" xmlns:mrc="http://standards.iso.org/iso/19115/-3/mrc/2.0" xmlns:mrd="http://standards.iso.org/iso/19115/-3/mrd/1.0" xmlns:mri="http://standards.iso.org/iso/19115/-3/mri/1.0" xmlns:mrl="http://standards.iso.org/iso/19115/-3/mrl/2.0" xmlns:mrs="http://standards.iso.org/iso/19115/-3/mrs/1.0" xmlns:msr="http://standards.iso.org/iso/19115/-3/msr/2.0" xmlns:mdq="http://standards.iso.org/iso/19157/-2/mdq/1.0" xmlns:mac="http://standards.iso.org/iso/19115/-3/mac/2.0" xmlns:gco="http://standards.iso.org/iso/19115/-3/gco/1.0" xmlns:gml="http://www.opengis.net/gml/3.2" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://standards.iso.org/iso/19115/-3/mdb/2.0 https://schemas.isotc211.org/19115/-3/mdb/2.0/mdb.xsd"> <mdb:metadataIdentifier> <mcc:MD_Identifier> <mcc:code> <gco:CharacterString>34831b8d-9da1-4a19-b425-482f982381d9</gco:CharacterString> </mcc:code> <mcc:codeSpace> <gco:CharacterString>urn:uuid</gco:CharacterString> </mcc:codeSpace> </mcc:MD_Identifier> </mdb:metadataIdentifier> <mdb:defaultLocale> <lan:PT_Locale id="FR"> <lan:language> <lan:LanguageCode codeList="http://www.loc.gov/standards/iso639-2/" codeListValue="fre" /> </lan:language> <lan:characterEncoding> <lan:MD_CharacterSetCode codeList="http://standards.iso.org/iso/19115/resources/Codelists/cat/codelists.xml#MD_CharacterSetCode" codeListValue="utf8" /> </lan:characterEncoding> </lan:PT_Locale> </mdb:defaultLocale> <mdb:metadataScope> <mdb:MD_MetadataScope> <mdb:resourceScope> <mcc:MD_ScopeCode codeList="http://standards.iso.org/iso/19115/resources/Codelists/cat/codelists.xml#MD_ScopeCode" codeListValue="dataset" /> </mdb:resourceScope> <mdb:name> <gco:CharacterString>Collection de données</gco:CharacterString> </mdb:name> </mdb:MD_MetadataScope> </mdb:metadataScope> <mdb:contact> <cit:CI_Responsibility> <cit:role> <cit:CI_RoleCode codeList="http://standards.iso.org/iso/19115/resources/Codelists/cat/codelists.xml#CI_RoleCode" codeListValue="pointOfContact" /> </cit:role> <cit:party> <cit:CI_Organisation> <cit:name> <gco:CharacterString>Office français de la biodiversité</gco:CharacterString> </cit:name> <cit:contactInfo> <cit:CI_Contact> <cit:address> <cit:CI_Address> <cit:electronicMailAddress> <gco:CharacterString>sig@ogb.gouv.fr</gco:CharacterString> </cit:electronicMailAddress> </cit:CI_Address> </cit:address> </cit:CI_Contact> </cit:contactInfo> <cit:individual> <cit:CI_Individual> <cit:name> <gco:CharacterString>Délégation de façade Atlantique - Pôle géomatique</gco:CharacterString> </cit:name> <cit:positionName> <gco:CharacterString>Délégation de façade Atlantique</gco:CharacterString> </cit:positionName> </cit:CI_Individual> </cit:individual> </cit:CI_Organisation> </cit:party> </cit:CI_Responsibility> </mdb:contact> <mdb:dateInfo> <cit:CI_Date> <cit:date> <gco:DateTime>2020-10-22T13:06:46Z</gco:DateTime> </cit:date> <cit:dateType> <cit:CI_DateTypeCode codeList="http://standards.iso.org/iso/19115/resources/Codelists/cat/codelists.xml#CI_DateTypeCode" codeListValue="creation" /> </cit:dateType> </cit:CI_Date> </mdb:dateInfo> <mdb:dateInfo> <cit:CI_Date> <cit:date> <gco:DateTime>2021-09-30T08:10:14Z</gco:DateTime> </cit:date> <cit:dateType> <cit:CI_DateTypeCode codeList="http://standards.iso.org/iso/19115/resources/Codelists/cat/codelists.xml#CI_DateTypeCode" codeListValue="revision" /> </cit:dateType> </cit:CI_Date> </mdb:dateInfo> <mdb:metadataStandard> <cit:CI_Citation> <cit:title> <gco:CharacterString>ISO 19115-3:2018</gco:CharacterString> </cit:title> <cit:edition> <gco:CharacterString>1.0</gco:CharacterString> </cit:edition> </cit:CI_Citation> </mdb:metadataStandard> <mdb:metadataLinkage> <cit:CI_OnlineResource> <cit:linkage> <gco:CharacterString>https://data.ofb.fr/geonetwork/srv/api/records/34831b8d-9da1-4a19-b425-482f982381d9</gco:CharacterString> </cit:linkage> <cit:function> <cit:CI_OnLineFunctionCode codeList="http://standards.iso.org/iso/19115/resources/Codelists/cat/codelists.xml#CI_OnLineFunctionCode" codeListValue="completeMetadata" /> </cit:function> </cit:CI_OnlineResource> </mdb:metadataLinkage> <mdb:spatialRepresentationInfo> <msr:MD_GridSpatialRepresentation> <msr:numberOfDimensions> <gco:Integer>2</gco:Integer> </msr:numberOfDimensions> <msr:cellGeometry> <msr:MD_CellGeometryCode codeList="http://standards.iso.org/iso/19115/resources/Codelists/cat/codelists.xml#MD_CellGeometryCode" codeListValue="area" /> </msr:cellGeometry> <msr:transformationParameterAvailability> <gco:Boolean>1</gco:Boolean> </msr:transformationParameterAvailability> </msr:MD_GridSpatialRepresentation> </mdb:spatialRepresentationInfo> <mdb:referenceSystemInfo> <mrs:MD_ReferenceSystem> <mrs:referenceSystemIdentifier> <mcc:MD_Identifier> <mcc:code> <gcx:Anchor xlink:href="http://www.opengis.net/def/crs/EPSG/0/2154">EPSG:2154</gcx:Anchor> </mcc:code> <mcc:description> <gco:CharacterString>RGF93 / Lambert-93 (EPSG:2154)</gco:CharacterString> </mcc:description> </mcc:MD_Identifier> </mrs:referenceSystemIdentifier> </mrs:MD_ReferenceSystem> </mdb:referenceSystemInfo> <mdb:identificationInfo> <mri:MD_DataIdentification gco:isoType="gmd:MD_DataIdentification"> <mri:citation> <cit:CI_Citation> <cit:title> <gco:CharacterString>Zones de production ou de parcage conchylicole - Métropole (SANDRE, 10/2017) - [polygone]</gco:CharacterString> </cit:title> <cit:date> <cit:CI_Date> <cit:dateType> <cit:CI_DateTypeCode codeList="http://standards.iso.org/iso/19115/resources/Codelists/cat/codelists.xml#CI_DateTypeCode" codeListValue="creation" /> </cit:dateType> </cit:CI_Date> </cit:date> <cit:identifier> <mcc:MD_Identifier> <mcc:code> <gco:CharacterString>us_met_conchy_zone_production_sandre_201710_pol_wgs84</gco:CharacterString> </mcc:code> </mcc:MD_Identifier> </cit:identifier> </cit:CI_Citation> </mri:citation> <mri:abstract> <gco:CharacterString>Les zones de production conchylicole sont identifiées au titre du paquet européen hygiène (CE/854/2004) et de l'arrêté du 21 mai 1999 relatif au classement de salubrité et à la surveillance des zones de production et des zones de reparcage des coquillages vivants. L'ensemble des zones de production de coquillages (zones d’élevage et de pêche professionnelle) fait ainsi l’objet d’un classement sanitaire, défini par arrêté préfectoral. Celui-ci est établi sur la base d’analyses des coquillages présents : analyses microbiologiques utilisant Escherichia coli (E. coli) comme indicateur de contamination (en nombre d’E. coli pour 100 g de chair et de liquide intervalvaire - CLI) et dosage de la contamination en métaux lourds (plomb, cadmium et mercure), exprimé en mg/kg de chair humide. Le classement et le suivi des zones de production de coquillages distingue 3 groupes de coquillages au regard de leur physiologie : groupe 1 : les gastéropodes (bulots etc.), les échinodermes (oursins) et les tuniciers (violets) ; plus généralement des coquillages sauvages de gisements naturels, groupe 2 : les bivalves fouisseurs, c’est-à-dire les mollusques bivalves filtreurs dont l’habitat est constitué par les sédiments (palourdes, coques...) ; plus généralement des coquillages sauvages de gisements naturels, groupe 3 : les bivalves non fouisseurs, c’est-à-dire les autres mollusques bivalves filtreurs (huîtres, moules...) ; plus généralement des coquillages d'élevage. Ce concept est bien distinct de celui de 'Zone de qualité des eaux conchylicoles'. Le contour de la Zone de production conchylicole ne correspond pas au cadastre conchylicole (= cadastre des établissements de culture marine). Les différents classements des groupes sont les suivants : > Zones A : Zones dans lesquelles les coquillages peuvent être récoltés et mis directement sur le marché pour la consommation humaine directe après passage par un centre d'expédition agréé. > Zones B : Zones dans lesquelles les coquillages peuvent être récoltés mais ne peuvent être mis sur le marché pour la consommation humaine qu'après avoir été traités dans un centre de purification agréé ou après reparcage dans une zone spécifiquement agréée pour cette opération. > Zones C : Zones dans lesquelles les coquillages peuvent être récoltés mais ne peuvent être mis sur le marché pour la consommation humaine qu'après un reparcage de longue durée dans une zone agréée à cet effet ou après traitement thermique dans un établissement agréé. > Zones NC (zones non classées) : en l'absence de classement sanitaire, les activités de pêche ou d’élevage n'y sont pas autorisées. Seuls les pectinidés (coquilles Saint-Jacques, pétoncles), les gastéropodes non filtreurs (notamment bulots, ormeaux, patelles) et les échinodermes peuvent y être récoltés, sauf spécifications contraires. > Zones à exploitation occasionnelle (EO) dites "à éclipses" : zones dans lesquelles la récolte et la commercialisation de coquillages sont soumises à autorisation préalable et sous conditions particulières (arrêté préfectoral spécifique lors de l'exploitation). > Zones Interdites (I) : Zones d'activités portuaires et/ou zones polluées (zones autour d'émissaires de rejets ...), dans lesquelles aucune activité de pêche, de production ou de récolte de coquillage ne peut être pratiquée, quel que soit le groupe. La table attributaire est composée de 13 champs : - id : Identifiant - gid : ? - codenatzon : Ce code est l’identifiant national de la Zone de production conchylicole. - typezone : Classification de la zone - nomzone : Nom de la zone de production conchylicole tel que défini par la DDTM. - stzone : Le statut de la zone est défini dans la nomenclature 390 - datetexter : Ce texte correspond à la date de l'arrêté de délimitation - urltexter : URL du texte réglementaire - typeclasse : Code du Type de classement de coquillage - gp1 : classement du groupe 1 - gp2 : classement du groupe 2 - gp3 : classement du groupe 3 - datemajzon</gco:CharacterString> </mri:abstract> <mri:purpose gco:nilReason="missing"> <gco:CharacterString /> </mri:purpose> <mri:credit> <gco:CharacterString>AAMP/PNMI, 2016</gco:CharacterString> </mri:credit> <mri:status> <mcc:MD_ProgressCode codeList="http://standards.iso.org/iso/19115/resources/Codelists/cat/codelists.xml#MD_ProgressCode" codeListValue="completed" /> </mri:status> <mri:pointOfContact> <cit:CI_Responsibility> <cit:role> <cit:CI_RoleCode codeList="http://standards.iso.org/iso/19115/resources/Codelists/cat/codelists.xml#CI_RoleCode" codeListValue="owner" /> </cit:role> <cit:party> <cit:CI_Organisation> <cit:name> <gco:CharacterString>Office français de la biodiversité</gco:CharacterString> </cit:name> <cit:contactInfo> <cit:CI_Contact> <cit:address> <cit:CI_Address> <cit:electronicMailAddress> <gco:CharacterString>sig@ogb.gouv.fr</gco:CharacterString> </cit:electronicMailAddress> </cit:CI_Address> </cit:address> </cit:CI_Contact> </cit:contactInfo> <cit:individual> <cit:CI_Individual> <cit:name> <gco:CharacterString>Pôle géomatique</gco:CharacterString> </cit:name> <cit:positionName gco:nilReason="missing"> <gco:CharacterString /> </cit:positionName> </cit:CI_Individual> </cit:individual> </cit:CI_Organisation> </cit:party> </cit:CI_Responsibility> </mri:pointOfContact> <mri:pointOfContact> <cit:CI_Responsibility> <cit:role> <cit:CI_RoleCode codeList="http://standards.iso.org/iso/19115/resources/Codelists/cat/codelists.xml#CI_RoleCode" codeListValue="custodian" /> </cit:role> <cit:party> <cit:CI_Organisation> <cit:name> <gco:CharacterString>Office français de la biodiversité</gco:CharacterString> </cit:name> <cit:contactInfo> <cit:CI_Contact> <cit:address> <cit:CI_Address> <cit:deliveryPoint gco:nilReason="missing"> <gco:CharacterString /> </cit:deliveryPoint> <cit:city> <gco:CharacterString>Nantes</gco:CharacterString> </cit:city> <cit:postalCode> <gco:CharacterString>44100</gco:CharacterString> </cit:postalCode> <cit:country> <gco:CharacterString>FRANCE</gco:CharacterString> </cit:country> <cit:electronicMailAddress> <gco:CharacterString>melanie.odion@ofb.gouv.fr</gco:CharacterString> </cit:electronicMailAddress> </cit:CI_Address> </cit:address> </cit:CI_Contact> </cit:contactInfo> <cit:individual> <cit:CI_Individual> <cit:name> <gco:CharacterString>ODION Mélanie</gco:CharacterString> </cit:name> <cit:positionName> <gco:CharacterString>Délégation de façade Atlantique</gco:CharacterString> </cit:positionName> </cit:CI_Individual> </cit:individual> </cit:CI_Organisation> </cit:party> </cit:CI_Responsibility> </mri:pointOfContact> <mri:topicCategory> <mri:MD_TopicCategoryCode>environment</mri:MD_TopicCategoryCode> </mri:topicCategory> <mri:extent> <gex:EX_Extent> <gex:description> <gco:CharacterString>France</gco:CharacterString> </gex:description> <gex:geographicElement> <gex:EX_GeographicBoundingBox> <gex:westBoundLongitude> <gco:Decimal>-5.05085</gco:Decimal> </gex:westBoundLongitude> <gex:eastBoundLongitude> <gco:Decimal>6.66009</gco:Decimal> </gex:eastBoundLongitude> <gex:southBoundLatitude> <gco:Decimal>41.7877</gco:Decimal> </gex:southBoundLatitude> <gex:northBoundLatitude> <gco:Decimal>51.31309</gco:Decimal> </gex:northBoundLatitude> </gex:EX_GeographicBoundingBox> </gex:geographicElement> <gex:temporalElement> <gex:EX_TemporalExtent> <gex:extent> <gml:TimePeriod gml:id="N1037D"> <gml:beginPosition /> <gml:endPosition /> </gml:TimePeriod> </gex:extent> </gex:EX_TemporalExtent> </gex:temporalElement> </gex:EX_Extent> </mri:extent> <mri:resourceMaintenance> <mmi:MD_MaintenanceInformation> <mmi:maintenanceAndUpdateFrequency> <mmi:MD_MaintenanceFrequencyCode codeList="http://standards.iso.org/iso/19115/resources/Codelists/cat/codelists.xml#MD_MaintenanceFrequencyCode" codeListValue="unknown" /> </mmi:maintenanceAndUpdateFrequency> <mmi:updateScope> <mcc:MD_ScopeCode codeList="http://standards.iso.org/iso/19115/resources/Codelists/cat/codelists.xml#MD_ScopeCode" codeListValue="attribute" /> </mmi:updateScope> <mmi:updateScope> <mcc:MD_ScopeCode codeList="http://standards.iso.org/iso/19115/resources/Codelists/cat/codelists.xml#MD_ScopeCode" codeListValue="feature" /> </mmi:updateScope> </mmi:MD_MaintenanceInformation> </mri:resourceMaintenance> <mri:descriptiveKeywords> <mri:MD_Keywords> <mri:keyword> <gco:CharacterString>Classement sanitaire</gco:CharacterString> </mri:keyword> <mri:keyword> <gco:CharacterString>Zone de production</gco:CharacterString> </mri:keyword> <mri:keyword> <gco:CharacterString>Conchyliculture</gco:CharacterString> </mri:keyword> <mri:type> <mri:MD_KeywordTypeCode codeList="http://standards.iso.org/iso/19115/resources/Codelists/cat/codelists.xml#MD_KeywordTypeCode" codeListValue="theme" /> </mri:type> </mri:MD_Keywords> </mri:descriptiveKeywords> <mri:descriptiveKeywords> <mri:MD_Keywords> <mri:keyword> <gco:CharacterString>France</gco:CharacterString> </mri:keyword> <mri:keyword gco:nilReason="missing"> <gco:CharacterString /> </mri:keyword> <mri:keyword gco:nilReason="missing"> <gco:CharacterString /> </mri:keyword> <mri:keyword gco:nilReason="missing"> <gco:CharacterString /> </mri:keyword> <mri:type> <mri:MD_KeywordTypeCode codeList="http://standards.iso.org/iso/19115/resources/Codelists/cat/codelists.xml#MD_KeywordTypeCode" codeListValue="place" /> </mri:type> </mri:MD_Keywords> </mri:descriptiveKeywords> <mri:descriptiveKeywords> <mri:MD_Keywords> <mri:keyword> <gco:CharacterString>Conchyliculture</gco:CharacterString> </mri:keyword> <mri:keyword> <gco:CharacterString>mer</gco:CharacterString> </mri:keyword> <mri:type> <mri:MD_KeywordTypeCode codeList="http://standards.iso.org/iso/19115/resources/Codelists/cat/codelists.xml#MD_KeywordTypeCode" codeListValue="theme" /> </mri:type> <mri:thesaurusName> <cit:CI_Citation> <cit:title> <gco:CharacterString>GEMET</gco:CharacterString> </cit:title> <cit:date> <cit:CI_Date> <cit:date> <gco:Date>2011-07-13</gco:Date> </cit:date> <cit:dateType> <cit:CI_DateTypeCode codeList="http://standards.iso.org/iso/19115/resources/Codelists/cat/codelists.xml#CI_DateTypeCode" codeListValue="publication" /> </cit:dateType> </cit:CI_Date> </cit:date> </cit:CI_Citation> </mri:thesaurusName> </mri:MD_Keywords> </mri:descriptiveKeywords> <mri:descriptiveKeywords> <mri:MD_Keywords> <mri:keyword> <gco:CharacterString>Installations agricoles et aquacoles</gco:CharacterString> </mri:keyword> <mri:keyword> <gco:CharacterString>Zones de gestion, de restriction ou de réglementation et unités de déclaration</gco:CharacterString> </mri:keyword> <mri:type> <mri:MD_KeywordTypeCode codeList="http://standards.iso.org/iso/19115/resources/Codelists/cat/codelists.xml#MD_KeywordTypeCode" codeListValue="theme" /> </mri:type> <mri:thesaurusName> <cit:CI_Citation> <cit:title> <gco:CharacterString>INSPIRE Feature Concept Dictionary</gco:CharacterString> </cit:title> <cit:date> <cit:CI_Date> <cit:date> <gco:Date>2008-12-05</gco:Date> </cit:date> <cit:dateType> <cit:CI_DateTypeCode codeList="http://standards.iso.org/iso/19115/resources/Codelists/cat/codelists.xml#CI_DateTypeCode" codeListValue="publication" /> </cit:dateType> </cit:CI_Date> </cit:date> </cit:CI_Citation> </mri:thesaurusName> </mri:MD_Keywords> </mri:descriptiveKeywords> <mri:resourceConstraints> <mco:MD_LegalConstraints> <mco:useLimitation> <gco:CharacterString>Utilisation interdite pour un usage commercial. Modification et diffusion soumise à accord du distributeur.</gco:CharacterString> </mco:useLimitation> <mco:accessConstraints> <mco:MD_RestrictionCode codeList="http://standards.iso.org/iso/19115/resources/Codelists/cat/codelists.xml#MD_RestrictionCode" codeListValue="copyright" /> </mco:accessConstraints> <mco:useConstraints> <mco:MD_RestrictionCode codeList="http://standards.iso.org/iso/19115/resources/Codelists/cat/codelists.xml#MD_RestrictionCode" codeListValue="intellectualPropertyRights" /> </mco:useConstraints> <mco:otherConstraints> <gco:CharacterString>Citation obligatoire sur les cartes de la référence suivante : "OFB/SANDRE, 2017"</gco:CharacterString> </mco:otherConstraints> <mco:otherConstraints> <gco:CharacterString>Citation obligatoire dans la bibliographie de la référence suivante : "Office français de la biodiversité/Service d'Administration nationale des données et référentiels sur l'eau"</gco:CharacterString> </mco:otherConstraints> </mco:MD_LegalConstraints> </mri:resourceConstraints> <mri:resourceConstraints> <mco:MD_Constraints> <mco:useLimitation> <gco:CharacterString>Conditions inconnues</gco:CharacterString> </mco:useLimitation> </mco:MD_Constraints> </mri:resourceConstraints> <mri:defaultLocale> <lan:PT_Locale> <lan:language> <lan:LanguageCode codeList="http://www.loc.gov/standards/iso639-2/" codeListValue="fre" /> </lan:language> <lan:characterEncoding> <lan:MD_CharacterSetCode codeList="http://standards.iso.org/iso/19115/resources/Codelists/cat/codelists.xml#MD_CharacterSetCode" codeListValue="utf8" /> </lan:characterEncoding> </lan:PT_Locale> </mri:defaultLocale> <mri:supplementalInformation> <gco:CharacterString>Liste des champs et description</gco:CharacterString> </mri:supplementalInformation> </mri:MD_DataIdentification> </mdb:identificationInfo> <mdb:distributionInfo> <mrd:MD_Distribution> <mrd:distributor> <mrd:MD_Distributor> <mrd:distributorContact> <cit:CI_Responsibility> <cit:role> <cit:CI_RoleCode codeList="http://standards.iso.org/iso/19115/resources/Codelists/cat/codelists.xml#CI_RoleCode" codeListValue="distributor" /> </cit:role> <cit:party> <cit:CI_Organisation> <cit:name> <gco:CharacterString>Office français de la biodiversité</gco:CharacterString> </cit:name> <cit:contactInfo> <cit:CI_Contact> <cit:phone> <cit:CI_Telephone> <cit:number> <gco:CharacterString>0298338767</gco:CharacterString> </cit:number> <cit:numberType> <cit:CI_TelephoneTypeCode codeList="http://standards.iso.org/iso/19115/resources/Codelists/cat/codelists.xml#CI_TelephoneTypeCode" codeListValue="voice" /> </cit:numberType> </cit:CI_Telephone> </cit:phone> <cit:phone> <cit:CI_Telephone> <cit:number> <gco:CharacterString>0298338777</gco:CharacterString> </cit:number> <cit:numberType> <cit:CI_TelephoneTypeCode codeList="http://standards.iso.org/iso/19115/resources/Codelists/cat/codelists.xml#CI_TelephoneTypeCode" codeListValue="facsimile" /> </cit:numberType> </cit:CI_Telephone> </cit:phone> <cit:address> <cit:CI_Address> <cit:deliveryPoint> <gco:CharacterString>16 quai de la douane BP 42932</gco:CharacterString> </cit:deliveryPoint> <cit:city> <gco:CharacterString>Brest cedex 2</gco:CharacterString> </cit:city> <cit:postalCode> <gco:CharacterString>29229</gco:CharacterString> </cit:postalCode> <cit:country> <gco:CharacterString>FRANCE</gco:CharacterString> </cit:country> <cit:electronicMailAddress> <gco:CharacterString>sig@ofb.gouv.fr</gco:CharacterString> </cit:electronicMailAddress> </cit:CI_Address> </cit:address> </cit:CI_Contact> </cit:contactInfo> <cit:individual> <cit:CI_Individual> <cit:name> <gco:CharacterString>Pôle géomatique</gco:CharacterString> </cit:name> <cit:positionName> <gco:CharacterString>Appui aux politiques publiques</gco:CharacterString> </cit:positionName> </cit:CI_Individual> </cit:individual> </cit:CI_Organisation> </cit:party> </cit:CI_Responsibility> </mrd:distributorContact> </mrd:MD_Distributor> </mrd:distributor> <mrd:transferOptions> <mrd:MD_DigitalTransferOptions> <mrd:onLine> <cit:CI_OnlineResource> <cit:linkage> <gco:CharacterString>https://ofb.gouv.fr/</gco:CharacterString> </cit:linkage> <cit:protocol> <gco:CharacterString>WWW:LINK-1.0-http--link</gco:CharacterString> </cit:protocol> <cit:name> <gco:CharacterString>Office français de la biodiversité</gco:CharacterString> </cit:name> <cit:description> <gco:CharacterString>Site internet de l'Office français de la biodiversité</gco:CharacterString> </cit:description> <cit:function> <cit:CI_OnLineFunctionCode codeList="http://standards.iso.org/iso/19115/resources/Codelists/cat/codelists.xml#CI_OnLineFunctionCode" codeListValue="information" /> </cit:function> </cit:CI_OnlineResource> </mrd:onLine> </mrd:MD_DigitalTransferOptions> </mrd:transferOptions> </mrd:MD_Distribution> </mdb:distributionInfo> <mdb:dataQualityInfo> <mdq:DQ_DataQuality> <mdq:scope> <mcc:MD_Scope> <mcc:level> <mcc:MD_ScopeCode codeListValue="dataset" codeList="http://standards.iso.org/iso/19115/resources/Codelists/cat/codelists.xml#MD_ScopeCode" /> </mcc:level> </mcc:MD_Scope> </mdq:scope> <mdq:report> <mdq:DQ_DomainConsistency> <mdq:result> <mdq:DQ_ConformanceResult> <mdq:specification> <cit:CI_Citation> <cit:title> <gco:CharacterString>INSPIRE Implementing rules</gco:CharacterString> </cit:title> <cit:date> <cit:CI_Date> <cit:date> <gco:Date>2008-08-11</gco:Date> </cit:date> <cit:dateType> <cit:CI_DateTypeCode codeList="http://standards.iso.org/iso/19115/resources/Codelists/cat/codelists.xml#CI_DateTypeCode" codeListValue="publication" /> </cit:dateType> </cit:CI_Date> </cit:date> <cit:identifier> <mcc:MD_Identifier> <mcc:code> <gco:CharacterString>-- identifiant de la spécification --</gco:CharacterString> </mcc:code> <mcc:codeSpace> <gco:CharacterString>INSPIRE</gco:CharacterString> </mcc:codeSpace> </mcc:MD_Identifier> </cit:identifier> </cit:CI_Citation> </mdq:specification> <mdq:explanation> <gco:CharacterString>Non évalué</gco:CharacterString> </mdq:explanation> <mdq:pass> <gco:Boolean>true</gco:Boolean> </mdq:pass> </mdq:DQ_ConformanceResult> </mdq:result> </mdq:DQ_DomainConsistency> </mdq:report> <mdq:report> <mdq:DQ_ThematicClassificationCorrectness /> </mdq:report> </mdq:DQ_DataQuality> </mdb:dataQualityInfo> <mdb:resourceLineage> <mrl:LI_Lineage> <mrl:statement> <gco:CharacterString>DESCRIPTION DE LA GÉNÉALOGIE Plusieurs événements peuvent être détaillés plus bas (respecter la chronologie)</gco:CharacterString> </mrl:statement> <mrl:scope> <mcc:MD_Scope> <mcc:level> <mcc:MD_ScopeCode codeList="http://standards.iso.org/iso/19115/resources/Codelists/cat/codelists.xml#MD_ScopeCode" codeListValue="dataset" /> </mcc:level> </mcc:MD_Scope> </mrl:scope> <mrl:processStep> <mrl:LI_ProcessStep> <mrl:description> <gco:CharacterString>1/ ETAPE 1 : détailler</gco:CharacterString> </mrl:description> <mrl:processor> <cit:CI_Responsibility> <cit:role> <cit:CI_RoleCode codeList="http://standards.iso.org/iso/19115/resources/Codelists/cat/codelists.xml#CI_RoleCode" codeListValue="processor" /> </cit:role> <cit:party> <cit:CI_Individual> <cit:name gco:nilReason="missing"> <gco:CharacterString /> </cit:name> </cit:CI_Individual> </cit:party> </cit:CI_Responsibility> </mrl:processor> </mrl:LI_ProcessStep> </mrl:processStep> <mrl:processStep> <mrl:LI_ProcessStep> <mrl:description> <gco:CharacterString>2/ ETAPE 2 : détailler</gco:CharacterString> </mrl:description> <mrl:processor> <cit:CI_Responsibility> <cit:role> <cit:CI_RoleCode codeList="http://standards.iso.org/iso/19115/resources/Codelists/cat/codelists.xml#CI_RoleCode" codeListValue="processor" /> </cit:role> <cit:party> <cit:CI_Individual> <cit:name gco:nilReason="missing"> <gco:CharacterString /> </cit:name> </cit:CI_Individual> </cit:party> </cit:CI_Responsibility> </mrl:processor> </mrl:LI_ProcessStep> </mrl:processStep> <mrl:processStep> <mrl:LI_ProcessStep> <mrl:description> <gco:CharacterString>3/ ETAPE 3 : détailler</gco:CharacterString> </mrl:description> <mrl:processor> <cit:CI_Responsibility> <cit:role> <cit:CI_RoleCode codeList="http://standards.iso.org/iso/19115/resources/Codelists/cat/codelists.xml#CI_RoleCode" codeListValue="processor" /> </cit:role> <cit:party> <cit:CI_Individual> <cit:name gco:nilReason="missing"> <gco:CharacterString /> </cit:name> </cit:CI_Individual> </cit:party> </cit:CI_Responsibility> </mrl:processor> </mrl:LI_ProcessStep> </mrl:processStep> </mrl:LI_Lineage> </mdb:resourceLineage> </mdb:MD_Metadata>
Hors ligne
#9 Wed 13 November 2024 16:45
- Nicolas Ribot
- Membre
- Lieu: Toulouse
- Date d'inscription: 9 Sep 2005
- Messages: 1554
Re: Postgresql : extraction de valeur au sein d'un champ XML
Ok, dans un document xml avec des namespaces, il faut redéfinir les namespaces dans la fonction xpath, pour que PG puisse parser le doc.
Dans votre doc exemple, je n'ai pas trouvé les tags:
<gmd:organisationName>
<gco:CharacterString>SANDRE</gco:CharacterString>
Mais pour extraire par exemple les names des CI_Organisation, vous pouvez faire:
Code:
select id, unnest(xpath( '//cit:CI_Organisation/cit:name/gco:CharacterString/text()', doc, ARRAY[ ARRAY['cit', 'http://standards.iso.org/iso/19115/-3/cit/2.0'], ARRAY['gco', 'http://standards.iso.org/iso/19115/-3/gco/1.0'] ])) as orga_name from table_avec_xml;
les namespaces utilisés dans le xpath doivent etre définis dans la fonction, sous la forme d'arrays.
Vous trouvez ces valeurs dans le tag root de votre document, ou chaque namespace apparaissant dans le document (par ex gco:) est défini dans une propriété xmlns:gco=<valeur>, par ex: xmlns:gco="http://standards.iso.org/iso/19115/-3/gco/1.0"
Vous pourriez utiliser du SQL pour extraire les namespaces du document et créer les tableaux nécessaires pour la fonction xpath.
Nicolas
Dernière modification par Nicolas Ribot (Wed 13 November 2024 16:46)
Hors ligne
#10 Wed 13 November 2024 17:05
- image95
- Participant assidu
- Date d'inscription: 6 Sep 2014
- Messages: 257
Re: Postgresql : extraction de valeur au sein d'un champ XML
Un grand merci pour votre aide précieuse.
Hors ligne
#11 Wed 13 November 2024 17:21
- tumasgiu
- Membre
- Lieu: Ajaccio
- Date d'inscription: 5 Jul 2010
- Messages: 1161
Re: Postgresql : extraction de valeur au sein d'un champ XML
comme expliqué par Nicolas dans le post précédent, il faut rajouter les namespaces comme troisième paramètre :
Code:
select xpath( '//cit:CI_Organisation/cit:name/gco:CharacterString', '<xml>...</xml>'::xml, ARRAY [ ARRAY['mdb','http://standards.iso.org/iso/19115/-3/mdb/2.0'], ARRAY['cat','http://standards.iso.org/iso/19115/-3/cat/1.0'], ARRAY['gfc','http://standards.iso.org/iso/19110/gfc/1.1'], ARRAY['cit','http://standards.iso.org/iso/19115/-3/cit/2.0'], ARRAY['gcx','http://standards.iso.org/iso/19115/-3/gcx/1.0'], ARRAY['gex','http://standards.iso.org/iso/19115/-3/gex/1.0'], ARRAY['lan','http://standards.iso.org/iso/19115/-3/lan/1.0'], ARRAY['srv','http://standards.iso.org/iso/19115/-3/srv/2.1'], ARRAY['mas','http://standards.iso.org/iso/19115/-3/mas/1.0'], ARRAY['mcc','http://standards.iso.org/iso/19115/-3/mcc/1.0'], ARRAY['mco','http://standards.iso.org/iso/19115/-3/mco/1.0'], ARRAY['mda','http://standards.iso.org/iso/19115/-3/mda/1.0'], ARRAY['mds','http://standards.iso.org/iso/19115/-3/mds/2.0'], ARRAY['mdt','http://standards.iso.org/iso/19115/-3/mdt/2.0'], ARRAY['mex','http://standards.iso.org/iso/19115/-3/mex/1.0'], ARRAY['mmi','http://standards.iso.org/iso/19115/-3/mmi/1.0'], ARRAY['mpc','http://standards.iso.org/iso/19115/-3/mpc/1.0'], ARRAY['mrc','http://standards.iso.org/iso/19115/-3/mrc/2.0'], ARRAY['mrd','http://standards.iso.org/iso/19115/-3/mrd/1.0'], ARRAY['mri','http://standards.iso.org/iso/19115/-3/mri/1.0'], ARRAY['mrl','http://standards.iso.org/iso/19115/-3/mrl/2.0'], ARRAY['mrs','http://standards.iso.org/iso/19115/-3/mrs/1.0'], ARRAY['msr','http://standards.iso.org/iso/19115/-3/msr/2.0'], ARRAY['mdq','http://standards.iso.org/iso/19157/-2/mdq/1.0'], ARRAY['mac','http://standards.iso.org/iso/19115/-3/mac/2.0'], ARRAY['gco','http://standards.iso.org/iso/19115/-3/gco/1.0'], ARRAY['gml','http://www.opengis.net/gml/3.2'], ARRAY['xlink','http://www.w3.org/1999/xlink'], ARRAY['xsi','http://www.w3.org/2001/XMLSchema-instance'] ]
La requête complète peut être trouvée ici : https://dbfiddle.uk/RTirgBnU
Dernière modification par tumasgiu (Wed 13 November 2024 17:23)
Hors ligne
#12 Wed 13 November 2024 17:36
- Nicolas Ribot
- Membre
- Lieu: Toulouse
- Date d'inscription: 9 Sep 2005
- Messages: 1554
Re: Postgresql : extraction de valeur au sein d'un champ XML
Pour fabriquer le tableau des namespaces, vous pouvez parser le doc et splitter sur la chaine "xmlns:"
En virant le premier et dernier élement du tableau, vous pouvez construire le tableau de tableaux de namespaces attendu par xmlpath.
Par exemple (un peu crad...):
Code:
with tmp1 as ( select id, regexp_split_to_array(unnest(r[2:array_length(r, 1) - 1]), '=') as xmlns, doc from xml_data, regexp_split_to_array(replace(doc::text, '"', ''), ' xmlns:') r ), tmp2 as ( select id, array_agg(xmlns) as xmlns from tmp1 group by id ) select x.id, t.xmlns from tmp2 t join xml_data x using(id);
Et ensuite l'utiliser dans la fonction xpath:
(il faut virer les " pour créer des namespaces valides, raison de l'echec précédent, cf replace(doc::text, '"', '') dans la requête)
Code:
with tmp1 as ( select id, regexp_split_to_array( unnest(r[2:array_length(r, 1) - 1]), '=') as xmlns, doc from xml_data, regexp_split_to_array(replace(doc::text, '"', ''), ' xmlns:') r ), tmp2 as ( select id, array_agg(xmlns) as xmlns from tmp1 group by id ) select x.id,unnest(xpath( '//cit:CI_Organisation/cit:name/gco:CharacterString/text()', doc, t.xmlns)) as orga_name from tmp2 t join xml_data x using(id); +--+----------------------------------+ |id|orga_name | +--+----------------------------------+ |1 |Office français de la biodiversité| |1 |Office français de la biodiversité| |1 |Office français de la biodiversité| |1 |Office français de la biodiversité| +--+----------------------------------+
Nico
Dernière modification par Nicolas Ribot (Wed 13 November 2024 17:57)
Hors ligne
#13 Sun 17 November 2024 21:05
- image95
- Participant assidu
- Date d'inscription: 6 Sep 2014
- Messages: 257
Re: Postgresql : extraction de valeur au sein d'un champ XML
Bonjour,
Merci. Je viens de tester votre dernière proposition. Mais de mon coté j'ai un message d'erreur.
Code:
with tmp1 as ( select id, regexp_split_to_array(unnest(r[2:array_length(r, 1) - 1]), '=') as xmlns, data from public.metadata, regexp_split_to_array(replace(data::text, '"', ''), ' xmlns:') r ), tmp2 as ( select id, array_agg(xmlns) as xmlns from tmp1 group by id ) select x.id, t.xmlns from tmp2 t join public.metadata x using(id);
Voici ce que j'obtiens :
Code:
ERROR: cannot accumulate arrays of different dimensionality SQL state: 2202E
Je me permets une petite question additionnelle. Dans notre précédent exemple, dans la fonction xpath, on définissait uniquement un tag :
Code:
//cit:CI_Organisation/cit:name/gco:CharacterString/text()'
. Est il possible de définir plusieurs tags ? Par exemple, d'ajouter ce deuxième tag :
Code:
//gmd:organisationName/gco:CharacterString/text()'
Enfin, je me demandais si il était possible d'utiliser un order by "colonne_data" ASC/DESC pour trier sur les noms des organismes. Et/ou d'utiliser un "select distinct ou un group by afin de récupérer les valeurs uniques ? Juste pour rappel, je colle une requete qui fonctionne de mon coté:
Code:
select id, unnest(xpath( '//cit:CI_Organisation/cit:name/gco:CharacterString/text()', CAST(data AS XML), ARRAY[ ARRAY['cit', 'http://standards.iso.org/iso/19115/-3/cit/2.0'], ARRAY['gco', 'http://standards.iso.org/iso/19115/-3/gco/1.0'] ])) as orga_name from public.metadata
Par avance, un grans merci.
Dernière modification par image95 (Sun 17 November 2024 22:26)
Hors ligne
#14 Mon 18 November 2024 10:54
- tumasgiu
- Membre
- Lieu: Ajaccio
- Date d'inscription: 5 Jul 2010
- Messages: 1161
Re: Postgresql : extraction de valeur au sein d'un champ XML
Merci. Je viens de tester votre dernière proposition. Mais de mon coté j'ai un message d'erreur.
Une requête peut être un peu plus safe (fiddle ici : https://dbfiddle.uk/1KPNV_YC):
Code:
select array_agg( ARRAY[ substring(b, 7, position('=' in b) - 7), replace(substring(b, position('"' in b)), '"', '') ] ) from ( select regexp_matches(xml, 'xmlns:[^\s]+="[^\s]+"' , 'g' ) ) foo(b)
edit : le même code qu'au dessus en fonction. Il y a peut être des cas tordus de déclaration de namespaces qui ne passeront pas.
Code:
CREATE FUNCTION extract_xml_namespaces(xml text) returns TEXT[][] as $$ select array_agg( ARRAY[ substring(b, 7, position('=' in b) - 7), replace(substring(b, position('"' in b)), '"', '') ] ) from (select unnest(regexp_matches(xml,'xmlns:[^\s]+="[^\s]+"', 'g'))) as f(b) $$ language SQL immutable ;
. Est il possible de définir plusieurs tags ? Par exemple, d'ajouter ce deuxième tag :
Oui, avec l'opérateur ou (symbole |) :
Code:
//cit:CI_Organisation/cit:name/cit:CharacterString/text()|//cit:CI_Organisation/cit:name/gco:CharacterString/text()
Enfin, je me demandais si il était possible d'utiliser un order by "colonne_data" ASC/DESC pour trier sur les noms des organismes. Et/ou d'utiliser un "select distinct ou un group by afin de récupérer les valeurs uniques ? Juste pour rappel, je colle une requete qui fonctionne de mon coté:
Oui, le plus simple est d'essayer et de rajouter un group by ou order by organ_name à votr requête.
Dernière modification par tumasgiu (Tue 19 November 2024 09:33)
Hors ligne