В созданных метаданных какая-то часть содержащейся в них информации будет неизбежно изменяться со временем. Если эта информация относится к одному элементу ArcGIS, то вы можете редактировать ее метаданные, чтобы информация изменилась. Однако, если информация, которая изменилась, была включена в метаданные нескольких элементов ArcGIS, то процесс редактирования вручную метаданных всех затронутых элементов будет очень утомительным. К счастью, имеются различные способы обновления метаданных для сразу нескольких элементов.
Метаданные считаются внутренней частью элемента ArcGIS независимо от того, как элемент ArcGIS хранит эту информацию. Когда вы производите запрос на просмотр метаданных в ArcGIS, нужную вам информацию вы получите в виде XML-документа. Для обновления метаданных, хранимых в полученном XML-документе, существует два подхода. Чаще всего для изменения содержимого XML-файла используются таблицы стилей XSLT. XML-файлы также можно отредактировать программными методами. В обоих случаях вам необходимо сначала сохранить XML-документ в XML-файл. Затем вы можете отредактировать содержимое XML-файла, используя таблицу стилей XSLT или программный код, например, скрипт на языке Python.
Создайте таблицу стилей XSLT для обновления метаданных
Вы можете использовать пользовательскую таблицу стилей XSLT для обновления содержимого метаданных. Модель, которая показана ниже, можно использовать для первичной обработки метаданных элемента, используя выбранную вами таблицу стилей XSLT и инструмент Преобразование XSLT. Результат этого процесса будет сохранен в XML-файл. Затем модель сохранит обновленный XML-документ обратно в исходном объекте ArcGIS в виде его метаданных с помощью инструмента Импортер метаданных.
Более подробно об обработке метаданных элемента с помощью таблицы стилей XSLT
В сети Интернет имеется множество ресурсов, которые могут помочь вам научиться создавать собственные таблицы стилей XSLT. Примеры ниже помогут вам начать делать это. Они покажут вам, как изменить контактную информацию организации.
Предположим, что в исходных метаданных имелась информация о контактах, как показано ниже:
- Индивидуальное имя – Reception.
- Название организации – Esri Learning Center.
- Адрес – 380 New York St.
- Город – Redlands.
- Штат – Калифорния, CA.
- Почтовый индекс (ZIP) – 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>
В этом примере, некоторые элементы данной контактной информации требуется изменить следующим образом:
- Удалить индивидуальное имя из контактной информации.
- Изменить индекс (ZIP) на 92373-8100.
- Изменить адрес электронной почты на LearnGIS@esri.com.
- Изменить телефонный номер на 888-377-4575 x.1-3204.
- Добавить адрес веб-страницы, где можно найти информацию в сети Интернет, http://www.esri.com/training.
- Добавить информацию о возможном времени связи с организацией, с 8:00 до 17:00 по местному времени (Pacific Time).
Остальная информация остается без изменений.
Шаблон стилей XSLT выполнит следующие изменения. Элемент метаданных, отвечающий за индивидуальное имя, будет удален. Элементы метаданных, отвечающие за полный адрес, будут разом изменены (обновлены). Телефонный номер будет обновлен отдельно от остальной телефонной информации. Чтобы добавить веб-страницу и часы работы, всю остальную существующую контактную информацию необходимо скопировать, чтобы она не потерялась до того, как будет добавлена новая информация.
Шаблон стилей 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, в качестве выходных данных будет создан XML-файл. Используйте инструмент Импортер метаданных, чтобы сохранить эти изменения в исходном объекте 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 for Desktop имеется несколько шаблонов стилей XSLT, которые поддерживают работу моделей геообработки метаданных в наборе инструментов Конвертация, и они находятся в папке <ArcGIS Installation Location>\Metadata\Stylesheets\gpTools. Используйте их в качестве примеров.
Если вы собираетесь создавать собственные шаблоны стилей, полезно понять особенности формата XML, с которым вы работаете. Файл определения типа XML-документа (DTD), описывающий XML-формат метаданных ArcGIS, хранится в папке <ArcGIS Installation Location>\Metadata\Translator\Rules.
Обновление метаданных с помощью скриптов Python
Для обновления содержимого метаданных элемента также можно использовать скрипт Python. В коде скрипта Python будет нужно запустить те же самые инструменты геообработки, которые используются в модели обновления метаданных с помощью таблицы стилей XSLT, которая была описана выше. Инструмент Преобразование XSLT используется сначала, чтобы сохранить копию метаданных элемента в XML-файл с помощью exact copy of.xslt таблицы стилей в ArcGIS for Desktop. Полученный XML-файл можно отредактировать с помощью скрипта Python. Затем обновленный XML-документ нужно сохранить обратно в исходном объекте ArcGIS в виде его метаданных с помощью инструмента Импортер метаданных.
В примере скрипта Python ниже производится изменение текста для элемента Purpose (если такой есть) и добавление нового элемента Credits. XML-документ будет отредактирован с помощью Python ElementTree API, использование которого задокументировано в стандартной справке Python. Для редактирования XML-файлов имеются и другие пакеты Python; вы можете выбрать любой из них.
Пример скрипта Python, который производит обновление элемента Purpose и добавляет новый элемент Credits в метаданных объекта.
# 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')