Es ist unvermeidlich, dass im Laufe der Zeit Änderungen in vorhandenen Metadaten vorgenommen werden müssen, da sich einige Informationen ändern. Wenn die Informationen sich lediglich auf ein bestimmtes ArcGIS-Element beziehen, können Sie die Metadaten dieses Elements bearbeiten. Wenn die geänderten Informationen jedoch in den Metadaten vieler ArcGIS-Elemente enthalten sind, kostet es viel Zeit, die Metadaten für alle betroffenen Elemente manuell zu bearbeiten. Glücklicherweise stehen verschiedene Methoden zur Verfügung, um die Metadaten vieler Elemente gleichzeitig zu aktualisieren.
Metadaten werden als intern in einem ArcGIS-Element betrachtet, unabhängig davon, wie ein ArcGIS-Element diese Informationen speichert. Wenn ein ArcGIS-Element aufgefordert wird, seine Metadaten bereitzustellen, erfolgt dies in Form eines XML-Dokuments. Es gibt zwei allgemeine Ansätze zum Aktualisieren der Metadaten, die in dem XML-Dokument bereitgestellt werden. Die gängigste Methode zum Ändern des Inhalts einer XML-Datei ist die Verwendung eines XSLT-Stylesheets. XML-Dateien können auch programmgesteuert geändert werden. In beiden Fällen müssen Sie zunächst das XML-Dokument in einer XML-Datei speichern. Anschließend können Sie den Inhalt der XML-Datei ändern, indem Sie sie mit einem XSLT-Stylesheet verarbeiten oder ihren Inhalt programmgesteuert ändern, z. B. mit einem Python-Skript.
Erstellen eines XSLT-Stylesheets zum Aktualisieren von Metadaten
Sie können ein benutzerdefiniertes XSLT-Stylesheet verwenden, um den Metadateninhalt eines Elements zu aktualisieren. Mit einem Modell wie dem unten aufgeführten können Sie zunächst die Metadaten eines Elements anhand eines beliebigen XSLT-Stylesheets unter Verwendung des Werkzeugs XSLT-Transformation verarbeiten. Das Ergebnis dieses Prozesses wird in einer XML-Datei gespeichert. Anschließend speichert das Modell das aktualisierte XML-Dokument mit dem Werkzeug Metadatenimport wieder in dem ursprünglichen ArcGIS-Element als dessen Metadaten.
Weitere Informationen zum Verarbeiten der Metadaten eines Elements mit XSLT-Stylesheets
Im Internet finden Sie viele nützliche Ressourcen mit Informationen zum Erstellen von benutzerdefinierten XSLT-Stylesheets. Die unten gezeigten Beispiele sind eine Starthilfe. In den Beispielen wird dargestellt, wie die Kontaktinformationen einer Organisation geändert werden.
Nehmen Sie an, die ursprünglichen Metadaten enthalten die folgenden Kontaktinformationen, wobei Folgendes zutrifft:
- Einzelner Name: Reception.
- Der Organisationsname ist Esri Trainingscenter.
- Adresse: 380 New York St.
- Ort: Redlands.
- Bundesstaat: Kalifornien (CA).
- PLZ: 92373.
- Land: USA (US).
- E-Mail-Adresse: info@esri.com.
- Telefonnummer: 909-793-2853.
- Faxnummer: 909-793-4801.
- Für den Kontakt angegebene Rolle: Publisher (010).
Auszug eines Metadaten-XML-Dokuments, in dem die Kontaktinformationen der Organisation aktualisiert werden müssen:
<?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>
In diesem Szenario müssen diese Kontaktinformationen wie folgt bearbeitet werden:
- Der einzelne Name muss aus den Kontaktinformationen entfernt werden.
- Die Postleitzahl muss in 92373-8100 geändert werden.
- Die E-Mail-Adresse muss in LearnGIS@esri.com geändert werden.
- Die Telefonnummer muss in 888-377-4575 x.1-3204 geändert werden.
- Die folgende Adresse einer Webseite mit Informationen muss hinzugefügt werden: http://www.esri.com/training.
- Die folgenden Informationen zu den Geschäftszeiten der Organisation müssen hinzugefügt werden: 8:00am to 5:00pm Pacific Time.
Der Rest der Kontaktinformationen bleibt gleich.
Diese Änderungen werden mit dem folgenden XSLT-Stylesheet vorgenommen. Das Metadatenelement mit dem einzelnen Namen wird entfernt. Alle einzelnen Metadatenelemente der Adresse werden gleichzeitig aktualisiert. Die Telefonnummer wird getrennt vom Rest der Telefoninformationen aktualisiert. Bevor die Webseite und die Geschäftszeiten hinzugefügt werden, müssen alle anderen vorhandenen Kontaktinformationen kopiert werden, damit diese beim Hinzufügen der neuen Informationen erhalten bleiben.
Ein XSLT-Stylesheet, das die Kontaktinformationen für eine Organisation ändert und den restlichen Metadateninhalt kopiert:
<?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>
Durch die Bearbeitung der Beispielmetadaten mit diesem XSLT-Stylesheet und dem Werkzeug XSLT-Transformation wird die folgende XML-Datei ausgegeben. Anschließend werden die Änderungen mit dem Werkzeug Metadatenimport im ursprünglichen ArcGIS-Element gespeichert.
Ein Auszug der mit dem oben dargestellten XSLT-Stylesheet aktualisierten Metadaten:
<?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>
Mehrere XSLT-Stylesheets werden mit ArcGIS Desktop bereitgestellt, um die Metadaten-Geoverarbeitungsmodelle in der Toolbox Konvertierung im Ordner <ArcGIS Installation Location>\Metadata\Stylesheets\gpTools zu unterstützen. Verwenden Sie diese als Beispiele.
Diese helfen Ihnen bei der Erstellung Ihrer eigenen Stylesheets. Eine XML-DTD, die das ArcGIS-Metadaten-XML-Format beschreibt, wird im Ordner <ArcGIS Installation Location>\Metadata\Translator\Rules bereitgestellt.
Aktualisieren von Metadaten mit Python-Skripten
Ein anderer Ansatz ist die Verwendung eines Python-Skripts zum Aktualisieren des Metadateninhalts eines Elements. Das Python-Skript muss dieselben Geoverarbeitungswerkzeuge ausführen wie das oben beschriebene Modell, das Metadaten mit einem XSLT-Stylesheet verarbeitet. Mit dem Werkzeug XSLT-Transformation wird zunächst eine Kopie der Metadaten des Elements in einer XML-Datei gespeichert, indem das mit ArcGIS Desktop bereitgestellte exact copy of.xslt Stylesheet verwendet wird. Die resultierende XML-Datei kann mit einem Python-Skript geändert werden. Anschließend muss das aktualisierte XML-Dokument mit dem Werkzeug Metadatenimport wieder in dem ursprünglichen ArcGIS-Element als dessen Metadaten gespeichert werden.
Das nachfolgende Python-Skript ändert den Text in einem vorhandenen "Purpose"-Element, falls vorhanden, und fügt ein neues "Credits"-Element hinzu. Das XML-Dokument wird mit der ElementTree-API von Python geändert, die in der Standardbibliothek von Python dokumentiert ist. Andere APIs werden möglicherweise von anderen Python-Paketen zur Verfügung gestellt, um XML-Dateien zu ändern; Sie können diese stattdessen verwenden.
Ein Python-Skript, das das "Purpose"-Element aktualisiert und den Metadaten eines Elements ein neues "Credits"-Element hinzufügt.
# 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')