Une fois les métadonnées créées, certaines des informations qu'elles contiennent changeront inévitablement au fil du temps. Si les informations sont spécifiques à un élément ArcGIS, vous pouvez mettre à jour ses métadonnées pour modifier les informations. Toutefois, si les informations qui ne sont plus pertinentes sont comprises dans les métadonnées d'un grand nombre d'éléments ArcGIS, le processus de mise à jour manuelle des métadonnées pour tous les éléments concernés peut s'avérer fastidieux. Heureusement, différentes techniques permettent de mettre à jour les métadonnées de plusieurs éléments à la fois.
Les métadonnées sont considérées comme internes à un élément ArcGIS, quelle que soit la manière dont un élément ArcGIS stocke ces informations. Lorsque vous demandez à un élément ArcGIS de fournir ses métadonnées, il propose ces informations sous la forme d'un document XML. Deux méthodes générales permettent de mettre à jour les métadonnées stockées dans le document XML fourni. La méthode la plus répandue pour changer le contenu d'un fichier XML consiste à utiliser une feuille de style XSLT. Les fichiers XML peuvent également être modifiés par programmation. Dans les deux cas, vous devez d'abord enregistrer le document dans un fichier XML. Ensuite, vous pouvez modifier le contenu du fichier XML en le traitant avec une feuille de style XSLT ou par programmation, par exemple avec un script Python.
Créer une feuille de style XSLT pour mettre à jour des métadonnées
Vous pouvez utiliser une feuille de style XSLT personnalisée pour mettre à jour le contenu des métadonnées d'un élément. Un modèle, tel que celui ci-dessous, peut servir à d'abord traiter les métadonnées d'un élément à l'aide de la feuille de style XSLT de votre choix avec l'outil Transformation XSLT. Le résultat de ce traitement est enregistré dans un fichier XML. Ensuite, le modèle enregistre le document XML mis à jour dans l'élément ArcGIS d'origine en tant que ses métadonnées à l'aide de l'outil Importateur de métadonnées.
Différentes ressources sur Internet peuvent vous aider à créer des feuilles de style XSLT personnalisées. Toutefois, les exemples suivants vous aideront à démarrer. Ils illustrent la manière de modifier les informations de contact d'une organisation.
Supposons que les métadonnées d'origine comprennent des informations de contact pour les métadonnées, comme indiqué ci-dessous, où les conditions suivantes sont vraies :
- Le nom du contact est Réception.
- Le nom de l'organisation est Esri Learning Center.
- L'adresse est 380 New York St.
- La ville est Redlands.
- L'état est la Californie, CA.
- Le code postal est 92373.
- Le pays est les Etats-Unis d'Amérique, USA.
- L'adresse électronique est info@esri.com.
- Le numéro de téléphone est 909-793-2853.
- Le numéro de fax est 909-793-4801.
- Le rôle spécifié pour ce contact est éditeur, 010.
Extrait d'un document de métadonnées XML où les informations de contact de l'organisation doivent être mises à jour.
<?xml version="1.0" encoding="UTF-8"?>
<metadata>
<mdContact>
<rpIndName>Reception</rpIndName>
<rpOrgName>Esri Learning Center</rpOrgName>
<rpCntInfo>
<cntAddress>
<delPoint>380 New York St.</delPoint>
<city>Redlands</city>
<adminArea>CA</adminArea>
<postCode>92373</postCode>
<country>US</country>
<eMailAdd>info@esri.com</eMailAdd>
</cntAddress>
<cntPhone>
<voiceNum>909-793-2853</voiceNum>
<faxNum>909-793-4801</faxNum>
</cntPhone>
</rpCntInfo>
<role>
<RoleCd value="010"/>
</role>
</mdContact>
...
</metadata>
Dans ce scénario, ces coordonnées doivent être modifiées comme suit :
- Suppression du nom du contact des informations de contact.
- Modification du code postal en 92373-8100..
- Modification de l'adresse électronique en LearnGIS@esri.com..
- Modification du numéro de téléphone en 888-377-4575 x.1-3204..
- Ajout de l'emplacement d'une page Web contenant des informations utiles, http://www.esri.com/training..
- Ajout d'informations sur l'horaire à privilégier pour contacter l'organisation, 8:00am to 5:00pm Pacific Time..
Le reste des informations de contact restera inchangé.
La feuille de style XSLT suivante effectuera ces modifications. L'élément de métadonnées de nom du contact sera supprimé. L'adresse entière, ainsi que tous les éléments de métadonnées associés, est mise à jour immédiatement. Le numéro de téléphone est mis à jour séparément du reste des informations téléphoniques. Pour ajouter la page Web et les heures de disponibilité, toutes les autres informations de contact existantes doivent être copiées avant que les nouvelles informations soient ajoutées, pour prévenir tout risque de perte de données.
Feuille de style XSLT qui modifie les informations de contact pour une organisation et copie tout autre contenu de métadonnées.
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes" omit-xml-declaration="no" />
<!-- process the metadata using the templates below -->
<xsl:template match="/">
<xsl:apply-templates select="node() | @*" />
</xsl:template>
<!-- copy all metadata conent -->
<xsl:template match="node() | @*" priority="0">
<xsl:copy>
<xsl:apply-templates select="node() | @*" />
</xsl:copy>
</xsl:template>
<!-- all metadata XSLT stylesheets used to update metadata should be identical to this example up to this point -->
<!-- add the templates you'll use to update the metadata below -->
<!-- remove the individual name from the contact information for the organization name Esri Learning Center -->
<xsl:template match="rpIndName[../rpOrgName = 'Esri Learning Center']" priority="1" >
</xsl:template>
<!-- edit the address for any contact with the organization name Esri Learning Center -->
<xsl:variable name="newAddress" >
<cntAddress>
<delPoint>380 New York St.</delPoint>
<city>Redlands</city>
<adminArea>CA</adminArea>
<postCode>92373-8100</postCode>
<country>US</country>
<eMailAdd>LearnGIS@esri.com</eMailAdd>
</cntAddress>
</xsl:variable>
<xsl:template match="cntAddress[../../rpOrgName = 'Esri Learning Center']" priority="1" >
<xsl:copy-of select="$newAddress" />
</xsl:template>
<!-- edit all contacts with the organization name Esri Learning Center to have a new phone number -->
<xsl:variable name="newPhone">888-377-4575 x.1-3204</xsl:variable>
<xsl:template match="voiceNum[../../../rpOrgName = 'Esri Learning Center']" priority="1" >
<voiceNum><xsl:value-of select="$newPhone" /></voiceNum>
</xsl:template>
<!-- add hours of availability for the organization name Esri Learning Center -->
<xsl:template match="rpCntInfo[../rpOrgName = 'Esri Learning Center']" priority="1" >
<xsl:copy>
<xsl:apply-templates select="node() | @*" />
<cntOnlineRes>
<linkage>http://www.esri.com/training</linkage>
</cntOnlineRes>
<cntHours>8:00am to 5:00pm Pacific Time</cntHours>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
Lorsque cette feuille de style XSLT est utilisée pour modifier les métadonnées exemple mentionnées plus haut à l'aide de l'outil Transformation XSLT, le fichier XML ci-dessous est créé en sortie. Utilisez l'outil Importateur de métadonnées pour enregistrer ces modifications dans l'élément ArcGIS d'origine.
Extrait des métadonnées mises à jour produit par la feuille de style XSLT précitée.
<?xml version="1.0" encoding="UTF-8"?>
<metadata>
<mdContact>
<rpOrgName>Esri Learning Center</rpOrgName>
<rpCntInfo>
<cntAddress>
<delPoint>380 New York St.</delPoint>
<city>Redlands</city>
<adminArea>CA</adminArea>
<postCode>92373-8100</postCode>
<country>US</country>
<eMailAdd>LearnGIS@esri.com</eMailAdd>
</cntAddress>
<cntPhone>
<voiceNum>888-377-4575 x.1-3204</voiceNum>
<faxNum>909-793-4801</faxNum>
</cntPhone>
<cntOnlineRes>
<linkage>http://www.esri.com/training</linkage>
</cntOnlineRes>
<cntHours>8:00am to 5:00pm Pacific Time</cntHours>
</rpCntInfo>
<role>
<RoleCd value="010"/>
</role>
</mdContact>
...
</metadata>
Plusieurs feuilles de style XSLT sont fournies avec ArcGIS Desktop pour prendre en charge les modèles de géotraitement de métadonnées de la boîte à outils Conversion, dans le dossier <ArcGIS Installation Location>\Metadata\Stylesheets\gpTools. Utilisez les comme exemples.
Lorsque vous créerez vos propres feuilles de style, ils vous aideront répondre aux questions relatives au format XML que vous pourrez vous poser. Une DTD XML décrivant le format XML des métadonnées ArcGIS est fournie dans le dossier <ArcGIS Installation Location>\Metadata\Translator\Rules.
Mettre à jour les métadonnées avec des scripts Python
Une autre méthode consiste à utiliser un script Python pour mettre à jour le contenu des métadonnées d'un élément. Le script Python doit exécuter les mêmes outils de géotraitement que le modèle décrit ci-dessus qui traite les métadonnées à l'aide d'une feuille de style XSLT. L'outil Transformation XSLT est d'abord utilisé pour enregistrer une copie des métadonnées de l'élément dans un fichier XML à l'aide de la feuille de style exact copy of.xslt fournie avec ArcGIS Desktop. Le fichier XML obtenu peut être modifié avec un script Python. Ensuite, le document XML mis à jour doit être enregistré dans l'élément ArcGIS d'origine en tant que ses métadonnées à l'aide de l'outil Importateur de métadonnées.
Le script Python ci-dessous modifie le texte d'un élément Purpose existant, le cas échéant, et ajoute un nouvel élément Credits. Le document XML est modifié avec l'API ElementTree Python, qui est documentée dans la bibliothèque Python standard. D'autres API peuvent être disponibles dans d'autres paquetages Python pour modifier les fichiers XML. Vous pouvez les utiliser si vous le souhaitez.
Un script Python qui met à jour l'élément Purpose et ajoute un nouvel élément Credits aux métadonnées d'un élément.
# batch update metadata for datasets in a folder
import os, sys
import arcpy
import xml.etree.ElementTree as ET
# arcpy environments
arcpy.env.overwriteOutput = "True"
# Script arguments...
Source_Metadata = arcpy.GetParameter(0)
# Local variables
# new purpose text
newPurpose = "This is new text for an existing Purpose metadata element."
newCredits = "This is text for a new Credits metadata element."
# install location
dir = arcpy.GetInstallInfo("desktop")["InstallDir"]
# stylesheet to use
copy_xslt = r"{0}".format(os.path.join(dir,"Metadata\Stylesheets\gpTools\exact copy of.xslt"))
arcpy.AddMessage("XSLT: {0}".format(copy_xslt))
def update_metadata(root):
num_elements = 0
# modify purpose element's text
# there is only supposed to be one purpose element in metadata
# replace purpose element text if element exists
# if element doesn't exist, do nothing
purposeEls = root.findall(".//idPurp")
for element in purposeEls:
if element.text is not None:
element.text = newPurpose
num_elements += 1
# add credits element to dataIdInfo parent, if the parent exists
# ISO allows many dataIdInfo groups; ArcGIS generally supports only one, get the 1st
# ISO allows many idCredit elements: 1st on Item Description page, all on Resource Details page
# always append new idCredit element to 1st dataIdInfo with appropriate text
# existing idCredit elements remain in place
dataIdInfoEls = root.findall("./dataIdInfo[1]")
for element in dataIdInfoEls:
if element:
newCreditEl = ET.SubElement(element,"idCredit")
newCreditEl.text = newCredits
num_elements += 1
return num_elements
for item in Source_Metadata:
arcpy.AddMessage("Item: {0}".format(item))
# temporary XML file
xmlfile = arcpy.CreateScratchName(".xml",workspace=arcpy.env.scratchFolder)
#arcpy.AddMessage("Temporary XML file: {0}".format(xmlfile))
# export xml
arcpy.XSLTransform_conversion(item, copy_xslt, xmlfile, "")
# read in XML
tree = ET.parse(xmlfile)
root = tree.getroot()
changes = update_metadata(root)
#arcpy.AddMessage("number of elements updated: {0}".format(changes))
if changes > 0:
# save modifications to XML
#arcpy.AddMessage("Saving changes to temporary file...")
tree.write(xmlfile)
# import result back into metadata
arcpy.AddMessage("Saving updated metadata with the item...")
arcpy.MetadataImporter_conversion(xmlfile, item)
else:
arcpy.AddMessage("No changes to save")
arcpy.AddMessage('Finished updating metadata for all source metadata items')