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

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

注:

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

导出元数据

ArcGIS Desktop 导出元数据工具的各项功能现在可通过 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 导入元数据工具的各项功能现在可通过 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(src_csdgm_file, "FGDC_CSDGM")
tgt_item_md.save()

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

ArcGIS Desktop 元数据导入程序工具的各项功能现在可通过 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 同步元数据工具的各项功能现在可通过 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 升级元数据工具的各项功能现在可以通过 Metadata upgrade 方法使用。

以下示例将演示如何使用 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 转换工具的各项功能现在可通过 Metadata saveAsXMLsaveAsUsingCustomXSLT 方法使用。

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

保存项目的元数据的副本

以下列出的通过 XSLT 样式表在 ArcGIS Desktop 中所提供的功能,现在可通过 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')

从项目元数据中移除内容

以下列出的通过 XSLT 样式表在 ArcGIS Desktop 中所提供的功能,现在可通过 Metadata deleteContent 方法在 ArcGIS Pro 中使用。 无需指定 XSLT 样式表文件,而是指定用于删除内容的相应选项,如下所示。

ArcGIS Desktop XSLT 样式表ArcGIS Pro metadata_delete_option

remove geoprocessing history.xslt

GPHISTORY

remove thumbnail.xslt

THUMBNAIL

以下示例将演示如何使用 ArcGIS Desktop 删除项目元数据中记录的地理处理历史记录并将其保存到 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_noHistory.xml"
arcpy.XSLTransform_conversion(source_item, xslt_no_gp_history, output_no_gp_history)

# Filter the output metadata content further to remove thumbnails as well
xslt_no_thumbs = dir + "Metadata/Stylesheets/gpTools/remove thumbnail.xslt"
output_nogp_nothumbs = "C:/data/roads_noHistory_noThumbnails.xml"
arcpy.XSLTransform_conversion(output_no_gp_history, xslt_no_thumbs, output_nogp_nothumbs)

以下示例演示了如何使用 ArcGIS Pro 删除项目元数据中的地理处理历史记录和任何缩略图:

import arcpy
from arcpy import metadata as md

# Get the target item's Metadata object
poles_path = r'C:\Data\LocalArea.gdb\UtilityPoles'
tgt_item_md = md.Metadata(poles_path)

# Delete all geoprocessing history and any thumbnails from the item's metadata
if not tgt_item_md.isReadOnly:
    tgt_item_md.deleteContent('GPHISTORY')
    tgt_item_md.deleteContent('THUMBNAIL')
    tgt_item_md.save()

自定义 XSLT

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

除了上述 XSLT 样式表之外,ArcGIS Desktop 还提供了其他 XSLT 样式表来执行操作,例如从项目的 ArcGIS 元数据中移除 10.0 版本之前使用过且此后不再使用的元数据元素。

以下示例将演示如何使用自定义 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_fgdcCsdgm = os.path.join(dir, "Metadata/Stylesheets/gpTools/remove pre94 metadata elements.xslt")
output_no_fgdcCsdgm = "C:/data/roads_copy.xml"
arcpy.XSLTransform_conversion(source_item, xslt_no_fgdcCsdgm, output_no_fgdcCsdgm)

以上示例中使用的自定义 XSLT 样式表由 ArcGIS Desktop 提供,将与 XSLT 转换工具配合使用。 它从项目的元数据中删除了 10.0 版本之前提供的元数据编辑器使用过且此后未使用过的元素。

以下示例将演示如何使用 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
# unused ESRI-ISO and FGDC CSDGM elements
output_file = "C:/data/roads_no_fgdcCsdgm.xml"
dir = arcpy.GetInstallInfo("desktop")["InstallDir"]
xslt_no_fgdcCsdgm = os.path.join(dir, "Metadata/Stylesheets/gpTools/remove pre94 metadata elements.xslt")
src_item_md.saveAsUsingCustomXSLT(output_file, xslt_no_fgdcCsdgm)

如果您已安装 ArcGIS Desktop,则此 XSLT 样式表和以上脚本将在 ArcGIS Pro 中成功运行。 您可以将 XSLT 替换为您自己的自定义 XSLT,以在将项目的元数据保存至独立 XML 文件时对其进行相应修改。

注:

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

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

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

某些随附于 ArcGIS Desktop 的 XSLT 样式表(其功能尚未在 ArcGIS Pro 中提供)可与 MetadatasaveAsWithCustomXSLT 方法成功搭配使用。 但是,某些样式表(例如生成用于显示的 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.systemPython 脚本中运行该实用程序,如下图所示:

使用 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 元数据转换程序

将使用 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 中使用的、用于导入和导出元数据的转换不会产生此类消息。 在 ArcGIS Pro 中,ArcGIS 元数据 XML 格式和基于标准的 XML 格式之间的所有转换都是使用 XSLT 转换完成的。 使用适当的 Metadata 类方法导入和导出元数据。

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

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

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

元数据发布程序

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

相关主题