Форум программистов, компьютерный форум, киберфорум
Python для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.54/13: Рейтинг темы: голосов - 13, средняя оценка - 4.54
4 / 4 / 8
Регистрация: 11.11.2014
Сообщений: 256

XML. Как вставить тег в нужное место?

07.02.2020, 05:30. Показов 2812. Ответов 5

Студворк — интернет-сервис помощи студентам
Здравствуйте.
Помогите с функцией для вставки тега <oldprice> после <price> в XML файле.
В общем ситуация такая!
XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<shop>
    <offers>
        <offer>
            <price>670</price>
            <oldprice>985</oldprice>
        </offer>
        <offer>
            <price>1194</price>
            здесь надо вставить <oldprice>
        </offer>
        <offer>
            <price>1194</price>
            <oldprice>1784</oldprice>
        </offer>
        <offer>
            <price>350</price>
            здесь надо вставить <oldprice>
        </offer>
        <offer>
            ...
            ...
        </offer>
    </offers>
</shop>
вот мой код

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import xml.etree.ElementTree as ET
 
tree = ET.parse('1.xml')
root = tree.getroot()
 
    for offer in root.findall('shop/offers/offer'):
        # проверяем есть ли тег <oldprice>
        oldpr = oldprice_YN(offer)
 
        if oldpr:
            continue
        # Здесь нужна функция для вставки тега <oldprice>
 
# Проверяем есть ли тег <oldprice>
def oldprice_YN(offer):
    for ellem in list(offer):
        if ellem.tag == 'oldprice':
            return True
    return False
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
07.02.2020, 05:30
Ответы с готовыми решениями:

Как в XML вставить новый тег в определенном месте?
Необходимо в существующем XML добавить новый тег. В определенном месте. Что надо сделать, чтобы в строке 19 появился тег TotalNoOfCalls,...

Как вставить курсор в нужное место?
При клике на кнопку, в блок (с атрибутом contenteditable) помещается имя и оборачивается в элемент b и надо потом печатать после имени,...

Как вставить в список a2 элемент b, в нужное место
Как вставить в список a2 элемент b, в нужное место, т.е должно быть , как условие записать?

5
1303 / 843 / 409
Регистрация: 12.03.2018
Сообщений: 2,305
07.02.2020, 08:02
SubElement(offer, 'oldprice') или создать oldprice, затем offer.append(oldprice)
0
4 / 4 / 8
Регистрация: 11.11.2014
Сообщений: 256
07.02.2020, 12:38  [ТС]
Цитата Сообщение от ioprst Посмотреть сообщение
SubElement(offer, 'oldprice')
Я уже так пробовал.
только наверное будет правильнее так
Python
1
root.SubElement(offer, 'oldprice')
В результате выдает ошибку: AttributeError: 'xml.etree.ElementTree.Element' object has no attribute 'SubElement'
в чем проблема? Что я делаю не так?
0
Эксперт Python
5438 / 3859 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
07.02.2020, 13:54
Цитата Сообщение от Edgar4 Посмотреть сообщение
Что я делаю не так?
Не читаешь документацию.
SubElement метод ElementTree, а не Element коим является root.
0
1303 / 843 / 409
Регистрация: 12.03.2018
Сообщений: 2,305
07.02.2020, 13:55
Edgar4, неправильно. Правильно будет как-то так
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
import xml.etree.ElementTree as ET
 
XML = '''\
<shop>
    <offers>
        <offer>
            <price>670</price>
            <oldprice>985</oldprice>
        </offer>
        <offer>
            <price>1194</price>
        </offer>
        <offer>
            <price>1194</price>
            <oldprice>1784</oldprice>
        </offer>
        <offer>
            <price>350</price>
        </offer>
    </offers>
</shop>'''
 
root = ET.fromstring(XML)  # type: ET.Element
 
for offer in root.findall('offers/offer'):  # type: ET.Element
    for child in offer:
        if child.tag == 'oldprice':
            break
    else:
        oldprice = ET.SubElement(offer, 'oldprice')
        oldprice.text = 'ADD ELEMENT!'
 
print(ET.tostring(root).decode())
Результат:
XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<shop>
    <offers>
        <offer>
            <price>670</price>
            <oldprice>985</oldprice>
        </offer>
        <offer>
            <price>1194</price>
        <oldprice>ADD ELEMENT!</oldprice></offer>
        <offer>
            <price>1194</price>
            <oldprice>1784</oldprice>
        </offer>
        <offer>
            <price>350</price>
        <oldprice>ADD ELEMENT!</oldprice></offer>
    </offers>
</shop>
0
4 / 4 / 8
Регистрация: 11.11.2014
Сообщений: 256
07.02.2020, 21:44  [ТС]
ioprst, спасибо за помощь.
То что вы предлагаете добавляет тег в самый конец.
У меня у родителя <offers> несколько дочерних элементов.
Необходимо вставить после тега <price>, а не в самом конце.

Я пошел по другому, но почему то два тега записываются в одну строку.

Как можно можно теги записать построчно, а не в одну строку?
XML
1
2
3
4
5
<offer>
    <price>345</price>
    <oldprice>ADD ELEMENT</oldprice><categoryId>99051</categoryId>
    <picture>http://.../8.jpeg</picture>
</offer>
Вот код реализации

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
def oldprices(root):
    for offer in root.findall('shop/offers/offer'):
        for child in offer:
            if child.tag == 'oldprice':
                break
        else:
            for price in offer:
                if price.tag == 'price':
                    new_element = Element('oldprice')
                    new_element.text = 'ADD ELEMENT'
                    offer.insert(1, new_element)
 
                    break
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
07.02.2020, 21:44
Помогаю со студенческими работами здесь

Как вставить в Rtf аттачмент в нужное место?
Добрый день! Подскажите, плз, как программно вставить аттачмент в произвольное место RTF-поля? У меня только в конец получается :( И...

Как вставить число на нужное место, не нарушая упорядоченность массива?
Ребят, как вставить число на нужное место не нарушая порядок массива? А то не получается. #include &lt;iostream&gt; #include...

Как через админ панель вставить кусок кода в нужное место в верстке?
Как можно через админ панель вставить кусок кода в нужное место в верстке? Нужно в functions для этого прописывать отдельно шорткод...

Вставить break в нужное место.
Цикл есть, выход из него не могу понять куда сделать. Сек щас исправлю Добавлено через 45 секунд procedure...

Вставить цикл в нужное место
всем привет. есть код прорисовки луча от игрока к противникам и расположения индикаторов если они за пределами экрана. ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
Первый деплой
lagorue 16.01.2026
Не спеша развернул своё 1ое приложение в kubernetes. А дальше мне интересно создать 1фронтэнд приложения и 2 бэкэнд приложения развернуть 2 деплоя в кубере получится 2 сервиса и что-бы они. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит токи на L и напряжения на C в установ. режимах до и. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru