Skip to main content
 首页 » 编程设计

python之使用 Python 在 XML 中查找和替换标签

2025年05月04日10zdz8207

我之前提出过类似的问题,但这个问题略有不同。我想使用 python 查找和替换 XML 标签。我正在使用 XML 作为一些 GIS shapefile 的元数据上传。在元数据编辑器中,我可以选择收集特定数据的日期。选项是“单一日期”、“多个日期”和“日期范围”。在包含一系列日期标签的第一个 XML 中,您将看到带有一些子元素“begdate”、“begtime”、“enddate”和 的标签“rngdates”。我想编辑这些标签,使其看起来像包含多个单个日期的第二个 XML。新标签是“mdattim”、“sngdate”和“caldate”。我希望这已经足够清楚了,但如果需要,请询问更多信息。 XML 是一头怪兽,我还没有完全理解它。

谢谢, 迈克

第一个 XML:

<idinfo> 
  <citation> 
    <citeinfo> 
       <origin>My Company Name</origin> 
       <pubdate>05/04/2009</pubdate> 
       <title>Feature Class Name</title> 
       <edition>0</edition> 
       <geoform>vector digital data</geoform> 
       <onlink>.</onlink> 
     </citeinfo> 
   </citation> 
<descript> 
  <abstract>This dataset represents the GPS location of inspection points collected in the field for the Site Name</abstract> 
  <purpose>This dataset was created to accompany the clients Assessment Plan. This point feature class represents the location within the area that the field crews collected related data.</purpose> 
 </descript> 
<timeperd> 
 <timeinfo> 
   <rngdates> 
     <begdate>7/13/2010</begdate> 
     <begtime>unknown</begtime> 
     <enddate>7/15/2010</enddate> 
     <endtime>unknown</endtime> 
    </rngdates> 
 </timeinfo> 
 <current>ground condition</current> 
</timeperd> 

第二个 XML:

<idinfo> 
  <citation> 
    <citeinfo> 
      <origin>My Company Name</origin> 
      <pubdate>03/07/2011</pubdate> 
      <title>Feature Class Name</title> 
      <edition>0</edition> 
      <geoform>vector digital data</geoform> 
      <onlink>.</onlink> 
    </citeinfo> 
   </citation> 
 <descript> 
   <abstract>This dataset represents the GPS location of inspection points collected in the field for the Site Name</abstract> 
   <purpose>This dataset was created to accompany the clients Assessment Plan. This point feature class represents the location within the area that the field crews collected related data.</purpose> 
 </descript> 
<timeperd> 
 <timeinfo> 
  <mdattim> 
    <sngdate> 
      <caldate>08-24-2009</caldate> 
      <time>unknown</time> 
     </sngdate> 
    <sngdate> 
      <caldate>08-26-2009</caldate> 
    </sngdate> 
   <sngdate> 
      <caldate>08-26-2009</caldate> 
    </sngdate> 
   <sngdate> 
      <caldate>07-07-2010</caldate> 
    </sngdate> 
  </mdattim> 
</timeinfo> 

到目前为止,这是我的 Python 代码:

folderPath = "Z:\ESRI\Figure_Sourcing\Figures\Metadata\IOR_Run_Metadata_2009" 
 
for filename in glob.glob(os.path.join(folderPath, "*.xml")): 
 
    fullpath = os.path.join(folderPath, filename) 
 
    if os.path.isfile(fullpath): 
        basename, filename2 = os.path.split(fullpath) 
 
        root = ElementTree(file=r"Z:\ESRI\Figure_Sourcing\Figures\Metadata\Run_Metadata_2009\\" + filename2) 
 
        iter = root.getiterator() 
        #Iterate 
        for element in iter: 
            print element.tag 
 
            if element.tag == "begdate": 
                element.tag.replace("begdate", "sngdate") 

请您参考如下方法:

我相信我成功地使代码工作了。如果您需要从现有 XML 文件更改某些标签,这将允许您编辑它们。我需要执行此操作以在批处理脚本中为某些 GIS shapefile 创建元数据,以更改某些日期值,具体取决于它们是单个日期、多个日期还是日期范围。

此网页帮助很大:http://lxml.de/tutorial.html

我还有一些工作要做,但这是我从最初的问题中寻找的答案 :) 我相信这可以用于许多其他应用程序。

# Set workspace location for XML files 
folderPath = "Z:\ESRI\Figure_Sourcing\Figures\Metadata\IOR_Run_Metadata_2009" 
# Loop through each file and search for files with .xml extension 
for filename in glob.glob(os.path.join(folderPath, "*.xml")): 
 
    fullpath = os.path.join(folderPath, filename) 
 
    # Split file name from the directory path 
    if os.path.isfile(fullpath): 
        basename, filename2 = os.path.split(fullpath) 
        # Set variable to XML files 
        root = ElementTree(file=r"Z:\ESRI\Figure_Sourcing\Figures\Metadata\IOR_Run_Metadata_2009\\" + filename2) 
 
        # Set variable for iterator 
        iter = root.getiterator() 
        #Iterate through the tags in each XML file 
        for element in iter: 
            if element.tag == "timeinfo": 
                tree = root.find(".//timeinfo") 
                # Clear all tags below the "timeinfo" tag 
                tree.clear() 
                # Append new Element 
                element.append(ET.Element("mdattim")) 
                # Create SubElements to the parent tag 
                child1 = ET.SubElement(tree, "sngdate") 
                child2 = ET.SubElement(child1, "caldate") 
                child3 = ET.SubElement(child1, "time") 
                # Set text values for tags 
                child2.text = "08-24-2009" 
                child3.text = "unknown