メタデータを作成すると、時間の経過に伴ってその中の情報が変更されます。1 つの ArcGIS アイテムに固有の情報であれば、そのメタデータを編集して情報を変更できます。ただし、変更した情報が多くの ArcGIS アイテムのメタデータに含まれる場合、影響を受けるすべてのアイテムのメタデータを手動で編集するプロセスには労力を要します。さまざまな方法で、多くのアイテムのメタデータを一度に更新できます。
ArcGIS アイテムがこの情報をどのように格納しているかに関係なく、メタデータは ArcGIS アイテムの内部データであると見なされます。ArcGIS アイテムにメタデータの提供を要求すると、その情報が XML ドキュメントとして提供されます。提供された XML ドキュメントに格納されているメタデータを更新するには、2 つの一般的な手法があります。XML ファイルの内容を変更する最も一般的な方法は、XSLT スタイルシートを使用することです。プログラムで XML ファイルを変更することもできます。どちらの場合も、まず XML ドキュメントを XML ファイルに保存する必要があります。その後、XSLT スタイルシートで XML ファイルを処理して XML ファイルの内容を変更するか、Python スクリプトなどのプログラムで XML ファイルの内容を変更できます。
メタデータを更新するための XSLT スタイルシートの作成
カスタム XSLT スタイルシートを使うと、アイテムのメタデータ コンテンツを更新できます。以下のようなモデルを使用して、まず [XSLT 変換 (XSLT Transformation)] ツールで任意の XSLT スタイルシートによってアイテムのメタデータを処理できます。このプロセスの結果は、XML ファイルに保存されます。次に、このモデルでは、[メタデータ インポーター (Metadata Importer)] ツールを使用して、更新された XML ドキュメントを元の ArcGIS アイテムにメタデータとして保存します。
XSLT スタイルシートを使ったアイテムのメタデータ処理の詳細
カスタム XSLT スタイルシートの作成方法の学習に役立つリソースは、インターネット上で数多く提供されています。ただし、次の例は初めて取り組むときに役立つものです。これらは、組織の連絡先情報を変更する方法を示しています。
元のメタデータに次のようなメタデータの連絡先が含まれていたとします。
- 名前は Reception
- 組織名は Esri Learning Center
- 住所詳細は 380 New York St.
- 地区町村は Redlands
- 都道府県名はカリフォルニア、CA
- 郵便番号は 92373
- 国は米国、US
- 電子メール アドレスは info@esri.com
- 電話番号は 909-793-2853
- ファクシミリ番号は 909-793-4801
- この連絡先に指定されている役割は公開者、010
組織の連絡先情報を更新する必要のあるメタデータ XML ドキュメントの抜粋です。
<?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>
このシナリオでは、この連絡先情報を次のように編集する必要があります。
- 名前を連絡先情報から削除する。
- 郵便番号を 92373-8100 に変更する。
- 電子メール アドレスを LearnGIS@esri.com に変更する。
- 電話番号を 888-377-4575 x.1-3204 に変更する。
- インターネット上で情報を提供する Web ページの場所、http://www.esri.com/training を追加する。
- 組織に連絡可能な時間に関する情報、8:00am to 5:00pm Pacific Time を追加する。
上記以外の連絡先情報は変更しません。
次の XSLT スタイルシートがこれらの編集を実行します。名前のメタデータ エレメントは削除されます。アドレス全体が、すべての個別メタデータ エレメントとともに一度に更新されます。電話番号は他の電話情報とは別に更新されます。Web ページと連絡可能時間を追加するには、新しい情報を追加する前に、他の既存の連絡先情報をすべてコピーし、情報が失われないようにする必要があります。
組織の連絡先情報を編集し、他のすべてのメタデータ コンテンツをコピーする XSLT スタイルシート。
<?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>
この XSLT スタイルシートを使用し、上に例として示したメタデータを [XSLT 変換 (XSLT Transformation)] ツールを使用して編集すると、次のような出力 XML ファイルが出力として作成されます。[メタデータ インポーター (Metadata Importer)] ツールを使用して、元の ArcGIS アイテムとともにこれらの変更を保存します。
上記の XSLT スタイルシートで作成した更新済みメタデータの抜粋です。
<?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>
ArcGIS Desktop では、[変換] ツールボックスのメタデータ ジオプロセシング モデルをサポートするために、<ArcGIS Installation Location>\Metadata\Stylesheets\gpTools フォルダーにいくつかの XSLT スタイルシートが用意されています。これらを例として使用してください。
独自のスタイルシートを作成するときは、使用する XML 形式を理解しておくと役立ちます。ArcGIS メタデータ XML 形式について説明した XML DTD が <ArcGIS Installation Location>\Metadata\Translator\Rules フォルダーに入っています。
Python スクリプトによるメタデータの更新
Python スクリプトを使用してアイテムのメタデータ コンテンツを更新する方法もあります。Python スクリプトは、XSLT スタイルシートを使用してメタデータを処理する上記のモデルと同じジオプロセシング ツールを実行する必要があります。まず、[XSLT 変換 (XSLT Transformation)] ツールを使用し、ArcGIS Desktop で提供された exact copy of.xslt スタイルシートによってアイテムのメタデータのコピーを XML ファイルに保存します。作成された XML ファイルは、Python スクリプトで変更できます。次に、[メタデータ インポーター (Metadata Importer)] ツールを使用して、更新された XML ドキュメントを元の ArcGIS アイテムにメタデータとして保存する必要があります。
次の Python スクリプトは、既存の目的エレメント内のテキスト (存在する場合) を変更し、新しい著作権エレメントを追加しています。XML ドキュメントは、標準の Python ライブラリに記述されている Python ElementTree API を使用して変更されます。他の Python パッケージから他の API を使用して、XML ファイルを変更することもできます。
アイテムのメタデータで、目的エレメントを更新して新しい著作権エレメントを追加する Python スクリプト。
# 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')