Найти и заменить теги в XML с помощью Python - PullRequest
2 голосов
/ 03 августа 2011

Я уже предлагал похожий вопрос, но этот немного отличается.Я хочу найти и заменить теги XML с помощью Python.Я использую XML для загрузки в качестве метаданных для некоторых шейп-файлов ГИС.В редакторе метаданных у меня есть возможность выбрать даты сбора определенных данных.Возможные варианты: «одна дата», «несколько дат» и «диапазон дат».В первом XML, который содержит теги для диапазона дат, вы увидите теги «rngdates» с некоторыми подэлементами «begdate», «begtime», «enddate» и.Я хочу отредактировать эти теги так, чтобы они выглядели как второй 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")

1 Ответ

1 голос
/ 04 августа 2011

Я считаю, что мне удалось заставить код работать. Это позволит вам редактировать определенные теги, если вам нужно изменить их из существующего файла XML. Мне нужно было сделать это, чтобы создать метаданные для некоторых шейп-файлов ГИС в сценарии пакетной обработки, чтобы изменить определенные значения даты в зависимости от того, были ли они отдельными датами, несколькими датами или диапазоном дат.

Эта веб-страница очень помогла: 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
...