Я новичок в 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
Вставить элементы в XML-код в правильном порядке/последовательности? Код Python ⇐ Python
Программы на Python
1731982451
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.
Я не знаю, как это сделать. напишите код для достижения этой цели. Будем признательны за любую помощь, спасибо!
[b]Итак, основываясь на том, что предложил LMC[/b], я попытался интегрировать новый код, но через много часов мне не удалось его получить. работать. Вот что у меня есть на данный момент. Будем признательны за любые предложения относительно того, что я делаю неправильно:
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)
Подробнее здесь: [url]https://stackoverflow.com/questions/79201171/insert-elements-into-xml-code-in-the-proper-order-sequence-python-code[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия