将元数据脚本从 ArcMap 迁移至 ArcGIS Pro

用于管理 ArcGIS Desktop 中元数据的 Python 脚本必须先进行修改,才能在 ArcGIS Pro 中运行。以下各节将介绍转换工具箱中的 ArcGIS Desktop 提供的工具以及 arcpy.metadata 中提供的功能之间的重要更改。

注:

XML 模式验证验证元数据工具在 ArcGIS Desktop 中提供的功能,在 ArcGIS Pro 中尚不可用。未来的版本中将添加这些功能。

导出元数据

ArcGIS Desktop 导出元数据工具的各项功能现在可通过 arcpy.metadata exportMetadata 函数使用。应将使用以下转换程序为 ArcGIS Desktop 编写的脚本更新为使用适当的元数据导出选项,如下所示。

ArcGIS Desktop 转换程序ArcGIS Pro metadata_export_option

ARCGIS2FGDC.xml

FGDC_CSDGM

ARCGIS2ISO19139.xml

ISO19139

ARCGIS2ISO19139gml321.xml

ISO19139_GML32

以下示例将演示如何使用 ArcGIS Desktop 将项目的元数据导出为 FGDC CSDGM 格式的元数据 XML 文件:

import arcpy
import os
dir = arcpy.GetInstallInfo("desktop")["InstallDir"]
translator = os.path.join(dir, "Metadata/Translator/ARCGIS2FGDC.xml")
source_item = "C:/data/data.gdb/roads"
output_file = "C:/data/roads_csdgm.xml"
arcpy.ExportMetadata_conversion(source_item,translator, output_file)

以下示例将演示如何使用 ArcGIS Pro 将项目的元数据导出为 FGDC CSDGM 格式的元数据 XML 文件:

import arcpy from arcpy import metadata as md
src_item_md = md.Metadata("C:/data/data.gdb/roads") output_file = "C:/data/roads_csdgm.xml"
src_item_md.exportMetadata(output_file, 'FGDC_CSDGM')

导入和复制元数据

ArcGIS Desktop 导入元数据工具的各项功能现在可通过 arcpy.metadata importMetadata 函数使用。应将使用以下导入类型设置为 ArcGIS Desktop 编写的脚本更新为使用适当的导入选项,如下所示。

ArcGIS Desktop Import_TypeArcGIS Pro import_option

FROM_ARCGIS

ARCGIS_METADATA

FROM_FGDC

FGDC_CSDGM

FROM_ISO_19139

ISO19139_UNKNOWN

以下示例将演示如何使用 ArcGIS Desktop 将描述某些数据的 FGDC CSDGM 格式元数据 XML 文件的内容导入到表示相同数据的项目中:

import arcpy
csdgm_file = "C:/data/roads_csdgm.xml"
target_item = "C:/data/data.gdb/streams"
arcpy.ImportMetadata_conversion(csdgm_file, "FROM_FGDC", target_item)

以下示例将演示如何使用 ArcGIS Pro 将描述某些数据的 FGDC CSDGM 格式元数据 XML 文件的内容导入到表示相同数据的项目中:

import arcpy from arcpy import metadata as md
src_csdgm_file = "C:/data/roads_csdgm.xml"
tgt_item_md = md.Metadata("C:/data/data.gdb/streams") tgt_item_md.importMetadata(csdgm_file,"FGDC_CSDGM") tgt_item_md.save()

将更改保存到项目的元数据

ArcGIS Desktop 元数据导入程序工具的各项功能现在可通过 arcpy.metadata copy 函数使用。应使用此函数将 ArcGIS 元数据格式的内容从一个项目转换到另一个项目,例如从元数据模板转换到要素类。

以下示例将演示如何使用 ArcGIS Desktop 将内容从 ArcGIS 元数据模板复制到另一个项目:

import arcpy
src_template = "C:/data/arcgis_template.xml"
target_fc = "C:/data/data.gdb/streams"
arcpy.MetadataImporter_conversion(src_template, target_fc)

以下示例将演示如何使用 ArcGIS Pro 将内容从 ArcGIS 元数据模板复制到另一个项目:

import arcpy from arcpy import metadata as md
src_template_md = md.Metadata("C:/data/arcgis_template.xml") tgt_item_md = md.Metadata("C:/data/data.gdb/streams") tgt_item_md.copy(src_template_md) tgt_item_md.save()

同步元数据内容

ArcGIS Desktop 同步元数据工具的各项功能现在可通过 arcpy.metadata synchronize 函数使用。

以下示例将演示如何使用 ArcGIS Desktop 更新存储在其元数据中的项目的属性:

import arcpy
source_item = "C:/data/data.gdb/roads"
arcpy.MetadataImporter_conversion(source_item, "ALWAYS")

以下示例将演示如何使用 ArcGIS Pro 将内容从 ArcGIS 元数据模板复制到另一个项目:

import arcpy from arcpy import metadata as md
src_item_md = md.Metadata("C:/data/data.gdb/roads") src_item_md.synchronize("ALWAYS")

升级元数据

ArcGIS Desktop 升级元数据工具的各项功能现在可以从 arcpy.metadataupgrade 函数中使用。

以下示例将演示如何使用 ArcGIS Desktop 将已存档项目的元数据导出为 ArcGIS 元数据格式:

import arcpy
source_item = r'C:\Data\Old.gdb\Buildings' arcpy.UpgradeMetadata_conversion(source_item, "FGDC_TO_ARCGIS")

以下示例将演示如何使用 ArcGIS Pro 将已存档项目的元数据导出为 ArcGIS 元数据格式:

import arcpy from arcpy import metadata as md
archive_item_md = md.Metadata(r'C:\Data\Old.gdb\Buildings') archive_item_md.upgrade('FGDC_CSDGM')

保存项目的元数据的副本,或过滤其内容

ArcGIS Desktop XSLT 转换工具的各项功能现在可通过 arcpy.metadata saveAsXMLsaveAsUsingCustomXSLT 函数使用。

通过软件随附的 XSLT 样式表可在 ArcGIS Desktop 中支持某些管理元数据的常用操作。这些样式表与 XSLT 转换工具一起使用,可以对项目的元数据进行所需的更改、保存项目的元数据的副本或生成不同输出类型。其中的许多操作仍可在 ArcGIS Pro 中使用,如下所述。各项功能现已内置在 ArcGIS Pro 中,而不是作为 XSLT 样式表资源提供。

保存项目的元数据的副本

以下列出的通过 XSLT 样式表在 ArcGIS Desktop 中所提供的功能,现在可通过 arcpy.metadata saveAsXML 函数在 ArcGIS Pro 中使用。无需指定 XSLT 样式表文件,而是指定相应的另存为 XML 选项,如下所示。

ArcGIS Desktop XSLT 样式表ArcGIS Pro metadata_save_as_xml_option

exact copy of.xslt

EXACT_COPY

remove local storage info strict.xslt

REMOVE_ALL_SENSITIVE_INFO

remove local storage info.xslt

REMOVE_MACHINE_NAMES

generate metadata template.xslt

TEMPLATE

以下示例将演示如何使用 ArcGIS Desktop 将项目元数据的副本保存为 ArcGIS 元数据格式的 XML 文件,以及经过滤的同一项目元数据的版本来删除可能出现的任何计算机名称:

import arcpy import os
source_item = "C:/data/data.gdb/roads"
dir = arcpy.GetInstallInfo("desktop")["InstallDir"]
# Save an exact copy of the item's ArcGIS metadata xslt_copy = os.path.join(dir, "Metadata/Stylesheets/gpTools/exact copy of.xslt") output_copy = "C:/data/roads_copy.xml"
arcpy.XSLTransform_conversion(source_item, xslt_copy, output_copy)
# Save a copy where metadata content is filtered to remove machine names filter = dir + "Metadata/Stylesheets/gpTools/remove local storage info.xslt"
output_filtered = "C:/data/roads_filtered.xml"
arcpy.XSLTransform_conversion(source_item, filter, output_filtered)

以下示例将演示如何使用 ArcGIS Pro 将项目元数据的副本保存为 ArcGIS 元数据格式的 XML 文件,以及经过滤的同一项目元数据的版本来删除可能出现的任何计算机名称:

import arcpy from arcpy import metadata as md
src_item_md = md.Metadata("C:/data/data.gdb/roads")
# Save an exact copy of the item's ArcGIS metadata output_copy = "C:/data/roads_copy.xml"
src_item_md.saveAsXML(output_copy)
# Save a copy where metadata content is filtered to remove machine names output_filtered = "C:/data/roads_filtered.xml' src_item_md.saveAsXML(output_filtered, 'REMOVE_MACHINE_NAMES')

注:

ArcGIS Desktop 提供的其他 XSLT 样式表可执行从项目元数据中删除缩略图或地理处理历史记录等操作。这些功能将在 ArcGIS Pro 未来版本中提供。

自定义 XSLT

可以创建自定义 XSLT 样式表,以生成可在组织的网站上使用的 HTML 文件,例如,共享可用于来描述地图和数据集的元数据。自定义 XSLT 样式表还可用于修改项目的 ArcGIS 元数据内容,例如,更新联系人信息或访问权限以及使用限制。

以下示例将演示如何使用自定义 XSLT 样式表将项目元数据的副本保存为 ArcGIS 元数据格式 XML 文件,作为此过程的一部分,该样式表将移除项目的一些原始元数据内容:

import arcpy import os
source_item = "C:/data/data.gdb/roads"
dir = arcpy.GetInstallInfo("desktop")["InstallDir"]
# Save copy of the item's ArcGIS metadata that is filtered to remove geoprocessing history xslt_no_gp_history = os.path.join(dir, "Metadata/Stylesheets/gpTools/remove_gp_history.xslt") output_no_gp_history = "C:/data/roads_copy.xml"
arcpy.XSLTransform_conversion(source_item, xslt_no_gp_history, output_no_gp_history)

以上示例中使用的自定义 XSLT 样式表由 ArcMap 提供,将与 ArcGIS Desktop XSLT 转换工具配合使用,用于从项目的元数据中移除该项目的地理处理历史记录。如果您已安装 ArcMap,则此 XSLT 和以上脚本将在 ArcGIS Pro 中成功运行。您可以将以上示例中的 XSLT 替换为您自己的自定义 XSLT,以在将项目的元数据保存至独立 XML 文件时对其进行相应修改。

以下示例将演示如何使用 ArcGIS Pro 将项目元数据的副本保存为 ArcGIS 元数据格式 XML 文件,其中该文件将使用可过滤掉项目地理处理历史记录的自定义 XSLT 样式表:

import arcpy import os
from arcpy import metadata as md src_item_md = md.Metadata("C:/data/data.gdb/roads")
# Save copy of the item's ArcGIS metadata that is filtered to remove geoprocessing history output_file = "C:/data/roads_no_gp_history.xml"
dir = arcpy.GetInstallInfo("desktop")["InstallDir"] xslt_no_gp_history = os.path.join(dir, "Metadata/Stylesheets/gpTools/remove_gp_history.xslt") src_item_md.saveAsUsingCustomXSLT(output_file, xslt_no_gp_history)

注:

以下所有操作将使用可处理项目 ArcGIS 元数据的 XSLT 样式表完成。Microsoft .NET Framework 的 XSLT 处理器用于在以下所有场景中执行转换操作。

  • ArcGIS Desktop 元数据工具 XSLT 转换,以及与导入元数据导出元数据工具搭配使用的一些选项。
  • 目录视图处于活动状态时,ArcGIS Pro 中功能区“目录”选项卡上提供的另存为导入导出升级选项将位于“元数据”组中。
  • ArcGIS Pro .NET SDK 方法SaveMetadataAsXMLSaveMetadataAsUsingCustomXSLT 以及 SaveMetadataAsHTMLExportMetadataImportMetadataUpgradeMetadata

但是,arcpy.metadata 模块的 saveAsXMLsaveAsUsingCustomXSLTimportMetadataexportMetadataupgrade 函数均使用 Microsoft Core XML Services (MSXML) XSLT 处理器完成。因此,某些 XSLT 样式表在 .NET Framework 执行转换时可成功运行,而相同 XSLT 样式表与 arcpy.metadata 模块搭配使用时可能无法成功运行,反之亦然。

某些随附于 ArcGIS Desktop 的 XSLT 样式表(其功能尚未在 ArcGIS Pro 中提供)可与 arcpy.metadata saveAsWithCustomXSLT 函数(包括 remove thumbnail.xsltremove geoprocessing history.xslt)成功搭配使用。但是,某些样式表(例如生成用于显示的 HTML 文件的样式表)将无法工作,因为必需的 .NET Framework XSLT 函数或自定义 ArcGIS Desktop XSLT 函数在使用 MSXML XSLT 处理器执行转换时不可用。

编辑多个 ArcGIS 项的元数据

ArcPy Metadata 对象的属性可让您在将项目发布到 ArcGIS Online 时访问和修改项目详细信息页面上显示的基本信息。但是,通常需要添加或更新的元数据的内容会更加详细。执行这些操作可以通过 Python 包(例如 xml.etree.ElementTreePyXMLlxml)来完成。

ArcMap 帮助提供了有关如何使用 ElementTree 在以下位置完成这些更新的示例:使用 Python 脚本更新元数据。此示例已进行了下列更新,以显示如何调整该脚本以在 ArcGIS Pro 中执行相同更新

批量更新数据集列表的元数据。此脚本旨在作为脚本工具运行。

import os import sys import xml.etree.ElementTree as ET import arcpy from arcpy import metadata as md
# 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."
# function to update purpose and credits in metadata 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 supports only one, so get the 1st    # ISO allows many idCredit elements, and many are supported in ArcGIS    # append a new idCredit element with appropriate text, existing elements remain    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
# get and save item metadata for item in Source_Metadata:
    arcpy.AddMessage("Item: {0}".format(item))        # get the item's metadata xml    item_md = md.Metadata(item)    metadata_xml_string = item_md.xml        # create an ElementTree object from the metadata XML string    root = ET.fromstring(metadata_xml_string)
    # call the update_metadata function to modify the item's metadata    changes = update_metadata(root)        if changes > 0:
        # get modified XML        updated_xml_string = ET.tostring(root, encoding="utf-8")                # import result back into metadata 
        arcpy.AddMessage("Saving updated metadata with the item...")        item_md.xml = updated_xml_string        item_md.save()    else:
        arcpy.AddMessage("No changes to save")
arcpy.AddMessage('Finished updating metadata for all source metadata items')

ArcGIS Pro 中不可用的 ArcGIS Desktop 工具

ArcGIS Desktop 中提供的某些工具不会迁移到 ArcGIS Pro

USGS MP 元数据转换程序

USGS MP 元数据转换器工具针对 USGS 元数据解析器实用程序 mp 的功能提供了有限访问权限。例如,它将仅接受 XML 文件作为输入。因此,您无法执行诸如将结构化文本文件转换为 FGDC CSDGM 格式的 XML 文件等操作。但是,当直接从 Python 访问该实用程序时,所有 mp 功能都可用。此外,ArcGIS Desktop 随附的 mp 版本已过期。从网站上下载 USGS 元数据解析器实用程序 mp 的最新版本,然后使用 os.system 在 Python 脚本中运行该实用程序,如下图所示:

使用 USGS 元数据解析器实用程序 mp 将结构化文本文件转换为 FGDC CSDGM 格式的 XML 文件。

import os
csdgm_xml_file = "D:/Metadata_Pro/arcpy/Map_current_csdgm.xml"
csdgm_txt_file = "D:/Metadata_Pro/arcpy/Output/csdgm_to_text.txt"
runCmd = "D:/Metadata_Pro/arcpy/mp.exe " + csdgm_txt_file + " -x " + csdgm_xml_file print(runCmd) os.system(runCmd)

Esri 元数据转换程序

ArcGIS 元数据 XML 格式和基于标准的 XML 格式之间的所有转换都是在 ArcGIS Pro 中使用 XSLT 转换完成的。将使用 Esri 元数据转换程序工具而非使用代码将元数据从一种格式转换为另一种格式。

这种转换机制会产生难以理解的消息,例如 Validation failed: em:Metadata($a) --> em:contact($a, $b), em:CI_ResponsibleParty($b)Error [InvalidForSome]: <MD_Metadata> for-some clause: em:contact(v:Metadata, v:Object) <contact>ArcGIS Pro 中使用的、用于导入和导出元数据的转换将产生此类消息。

批量导出元数据和批量验证元数据

提供的批量导出元数据批量验证元数据工具用于支持 ArcCatalog 元数据工具条。这些功能已在 ArcGIS Pro 中提供,无需使用上述工具。

ArcGIS Pro Python 脚本中,您可以通过使用 arcpy 列表函数访问数据集和文件的方式来导出(并在之后进行验证)许多项目的元数据,且可使用 arcpy.mp 列表函数来访问地图和图层。使用适当的 arcpy.metadata 函数管理这些列表返回的项目的元数据。

元数据发布程序

ArcGIS Desktop 中提供的元数据发布程序工具可将元数据发布到 ArcIMS 元数据服务。ArcIMS 已经停用。

相关主题