Вставить элементы в XML-код в правильном порядке/последовательности? Код PythonPython

Программы на Python
Ответить
Anonymous
 Вставить элементы в XML-код в правильном порядке/последовательности? Код Python

Сообщение Anonymous »

Я новичок в Python и пытаюсь создать сценарий, который откроет файл XML и вставит элемент XML в нужное место в последовательности элементов XML.
Итак далеко, у меня есть этот код:
import os
import xml.etree.ElementTree as ET

def process_xml_files(source_dir, target_dir):
# Create the target directory if it doesn't exist
if not os.path.exists(target_dir):
os.makedirs(target_dir)

# Iterate through all files in the source directory
for filename in os.listdir(source_dir):
if filename.endswith('.xml'):
file_path = os.path.join(source_dir, filename)
tree = ET.parse(file_path)
root = tree.getroot()

# Process each platformID group
for platformID in ['0', '1', '3']:
elements = root.findall(f".//namerecord[@platformID='{platformID}']")
if elements:
nameID_elements = {int(el.get('nameID')): el for el in elements}
if 8 not in nameID_elements:
# Create a new element with nameID="8"
new_element = ET.Element('namerecord', attrib={
'nameID': '8',
'platformID': platformID,
'platEncID': elements[0].get('platEncID'),
'langID': elements[0].get('langID'),

})
new_element.text = "\r" " " "New Entry" "\r" " "

# Insert the new element in the correct position
sorted_nameIDs = sorted(list(nameID_elements.keys()) + [8])
insert_index = sorted_nameIDs.index(8)

# Find the parent element
parent = root.find(".//name")
parent.insert(insert_index, new_element)

# Write the modified XML to the target directory
target_file_path = os.path.join(target_dir, filename)
tree.write(target_file_path, encoding='utf-8', xml_declaration=True)

source_directory = input("Enter the source directory: ")
target_directory = input("Enter the target directory: ")
process_xml_files(source_directory, target_directory)

Вот пример входного файла, требующего вставки.
Обратите внимание, что идентификаторы платформы сгруппированы вместе и в последовательном порядке по nameID:





Safe


Kitten


Calico


KittenCalico:1135918450


KittenCalico


1.00


KittenCalico



Safe


Kitten


Calico


KittenCalico:1135918450


KittenCalico


1.00


KittenCalico



Safe


Kitten Calico


Vanilla


KittenCalico:1135918450


KittenCalico


1.00


KittenCalico





Этот код Python выдал следующее. Обратите внимание, что новые записи не группируются по идентификаторам платформы в последовательном порядке по идентификатору имени:





Safe


Kitten


Calico


KittenCalico:1135918450


KittenCalico


1.00


KittenCalico



New Entry

New Entry

New Entry

Safe


Kitten


Calico


KittenCalico:1135918450


KittenCalico


1.00


KittenCalico



Safe


Kitten Calico


Vanilla


KittenCalico:1135918450


KittenCalico


1.00


KittenCalico





Я пытался получить вывод XML, который выглядит следующим образом:





Safe


Kitten


Calico


KittenCalico:1135918450


KittenCalico


1.00


KittenCalico


New Entry



Safe


Kitten


Calico


KittenCalico:1135918450


KittenCalico


1.00


KittenCalico


New Entry



Safe


Kitten Calico


Vanilla


KittenCalico:1135918450


KittenCalico


1.00


KittenCalico


New Entry





Кроме того, некоторые XML-файлы будут содержать nameID="7" и nameID после 8, например nameID="9", nameID="10" и т. д., поэтому nameID=8 не обязательно будет находиться в конце каждого идентификатора платформы, а будет между последовательными элементами nameID.
Я не знаю, как это сделать. напишите код для достижения этой цели. Будем признательны за любую помощь, спасибо!
Итак, основываясь на том, что предложил LMC, я попытался интегрировать новый код, но через много часов мне не удалось его получить. работать. Вот что у меня есть на данный момент. Будем признательны за любые предложения относительно того, что я делаю неправильно:
import os
import xml.etree.ElementTree as ET

def process_xml_files(source_dir, target_dir):
# Create the target directory if it doesn't exist
if not os.path.exists(target_dir):
os.makedirs(target_dir)

# Iterate through all files in the source directory
for filename in os.listdir(source_dir):
if filename.endswith('.xml'):
file_path = os.path.join(source_dir, filename)
tree = ET.parse(file_path)
root = tree.getroot()

# Process each platformID group
for platformID in ['0', '1', '3']:
elements = root.findall(f".//namerecord[@platformID='{platformID}']")
if elements:
nameID_elements = [int(el.get('nameID')) for el in elements if int(el.get('nameID')) < 8]
if 8 not in nameID_elements:
elpar = tree.getroot().find(".//namerecord[@platformID='0']...")

print(elpar)
new_element = ET.Element('namerecord', attrib={
'nameID': '8',
'platformID': platformID,
'platEncID': elements[0].get('platEncID'),
'langID': elements[0].get('langID'),

})

new_element.text = elements[0].tail + " some text" + elements[0].tail
new_element.tail = elements[0].tail

#idx = len(elements)
idx = elements.index(elements[-1]) + 1
#idx = nameID_elements.index(nameID_elements[-1]) + 1

elpar.insert(idx, new_element)

print(ET.tostring(elpar).decode('utf-8'))

# # Insert the new element in the correct position
# sorted_nameIDs = sorted(list(nameID_elements.keys()) + [8])
# insert_index = sorted_nameIDs.index(8)
#
# # Find the parent element
# parent = root.find(".//name")
# parent.insert(insert_index, new_element)

# Write the modified XML to the target directory
target_file_path = os.path.join(target_dir, filename)
tree.write(target_file_path, encoding='utf-8', xml_declaration=True)

source_directory = input("Enter the source directory: ")
target_directory = input("Enter the target directory: ")
process_xml_files(source_directory, target_directory)


Подробнее здесь: https://stackoverflow.com/questions/792 ... ython-code
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»