Форум программистов, компьютерный форум, киберфорум
Python для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/55: Рейтинг темы: голосов - 55, средняя оценка - 4.60
1 / 1 / 0
Регистрация: 17.08.2015
Сообщений: 16

Как в XML вставить новый тег в определенном месте?

30.07.2019, 09:27. Показов 11490. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Необходимо в существующем XML добавить новый тег. В определенном месте.
Что надо сделать, чтобы в строке 19 появился тег TotalNoOfCalls, в ветке ChargeInfo (15 строка в XML). Сейчас он указан, потому что вставил руками. Но как это сделать средствами Python?

Я пытался добавить так

Python
1
2
3
4
5
6
7
8
tree = ET.parse(r'C:/Files/' + file_rtdr)
root = tree.getroot()
for rec in root.iter('ChargeInfo'):
    for elem in rec:
        attrib = {}
        element = elem.makeelement('TotalNoOfCalls', attrib)
        elem.append(element)
    tree.write(r'C:/Files/new_xml')
Но тег появляется внизу. И не могу найти инфу, как вставить тег в определенное место.


Исходный 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
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
<?xml version="1.0" encoding="UTF-8"?>
<RTDR>
   <ConnectionList>
      <Connection>
         <VPMN>UKRUM</VPMN>
         <HPMN>LIEK9</HPMN>
         <FileItemList>
            <FileItem>
            <FileID>15031625</FileID>
               <ExchTmstp>2019-07-16T08:19:03+02:00</ExchTmstp>
               <FileType>
                  <InitTAP>
                     <TAPSeqNo>05238</TAPSeqNo>
                     <NotifFileInd>true</NotifFileInd>
                     <ChargeInfo>
                        <TAPTxCutoffTmstp>2019-07-16T06:00:00+03:00</TAPTxCutoffTmstp>
                        <TAPAvailTmstp>2019-07-16T06:42:34+03:00</TAPAvailTmstp>
                        <TAPCurrency>XDR</TAPCurrency>
                        <TotalNoOfCalls>0</TotalNoOfCalls>
                        <TotalNetCharge>0</TotalNetCharge>
                        <TotalTax>0</TotalTax>
                        <TrafficBreakdownList>
                           <TrafficBreakdownItem>
                              <CallEventType>CS MO</CallEventType>
                              <CallEventInfo>
                                 <NumberOfEvents>0</NumberOfEvents>
                                 <TotNetCharge>0.000000</TotNetCharge>
                                 <TotTaxValue>0.000000</TotTaxValue>
                              </CallEventInfo>
                           </TrafficBreakdownItem>
                        </TrafficBreakdownList>
                     </ChargeInfo>
                  </InitTAP>
               </FileType>
            </FileItem>
          </FileItemList>
      </Connection>
   </ConnectionList>
</RTDR>
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
30.07.2019, 09:27
Ответы с готовыми решениями:

XML. Как вставить тег в нужное место?
Здравствуйте. Помогите с функцией для вставки тега &lt;oldprice&gt; после &lt;price&gt; в XML файле. В общем ситуация такая! &lt;shop&gt; ...

Вставить строку в определенном месте в текстовый файл (на Perl)
Допустим есть текст в файле input.txt: блаблаблаба блаблаwww.yyy.com блаблабла бла бла бла блабла www.yyy.com блаблабла бла бла ...

Изменение XML файла (PHP, DOMElement и т.д.) в определенном месте
Суть проблемы: не могу изменить определенные значения в XML. 1. Есть XML файл. Он формируется посредcтвом PHP и дом $xml = new...

10
Эксперт Python
 Аватар для dondublon
4653 / 2073 / 366
Регистрация: 17.03.2012
Сообщений: 10,183
Записей в блоге: 6
30.07.2019, 12:58
Urusmab, так-то порядок элементов в xml несущественен, так что неудивительно, что либа этим не озаботилась.

Добавлено через 42 секунды
Urusmab, попробуйте вместо append вызвать insert (без гарантии).
1
Эксперт Python
5438 / 3859 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
30.07.2019, 13:06
Цитата Сообщение от dondublon Посмотреть сообщение
так-то порядок элементов в xml несущественен
Не существенен порядок атрибутов в теге (поэтому некоторые библиотеки не представляют возможность вставки атрибута в нужную позицию). А сами элементы нормально вставляются куда хошь. У каждого есть номер позиции.
0
1 / 1 / 0
Регистрация: 17.08.2015
Сообщений: 16
30.07.2019, 13:40  [ТС]
А каким методом можно вывести номер позиции? Чтобы понять, куда вставлять.
Для того же самого метода insert.
0
Эксперт Python
5438 / 3859 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
30.07.2019, 14:11
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
import xml.etree.ElementTree as etree
 
def indent(elem, level=0):
    '''создает красивый xml c отступами'''
    i = "\n" + level*"  "
    if len(elem):
        if not elem.text or not elem.text.strip():
            elem.text = i + "  "
        if not elem.tail or not elem.tail.strip():
            elem.tail = i
        for elem in elem:
            indent(elem, level+1)
        if not elem.tail or not elem.tail.strip():
            elem.tail = i
    else:
        if level and (not elem.tail or not elem.tail.strip()):
            elem.tail = i
 
 
tree = etree.parse(r'xml_test2.xml')
root = tree.getroot()
ChargeInfo = tree.findall('.//ChargeInfo')
TotalNoOfCalls = etree.Element("TotalNoOfCalls")
TotalNoOfCalls.text = "0"
ChargeInfo[0].insert(3,TotalNoOfCalls) # вставка в первый найденный элемент  ChargeInfo в третий от 0 индекс внутри  <ChargeInfo>
# без этого xml будет в одну строку; встроенная либа xml не умеет делать красивый xml, пользуйтесь lxml
indent(root) 
tree.write(r'xml_test3.xml',encoding="utf-8", xml_declaration=True)
Добавлено через 2 минуты
Цитата Сообщение от Urusmab Посмотреть сообщение
root.iter('ChargeInfo')
Я уже писал, что не нужно пользоваться этим бесполезным методом, когда есть более удобные.
0
1 / 1 / 0
Регистрация: 17.08.2015
Сообщений: 16
30.07.2019, 14:45  [ТС]
Да, я помню конечно.
Но я его как-то неправильно использую. Я удалил в XML пространство имен. Потому что пока не получается с ним нормально изменить файл.
И теперь findall ничего не находит.

Python
1
2
for rec in root.findall('ChargeInfo'):
    print('ok')
в моем случае ничего не выводит. Поэтому пользуюсь iter.
0
Эксперт Python
5438 / 3859 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
30.07.2019, 14:52
Цитата Сообщение от Urusmab Посмотреть сообщение
И теперь findall ничего не находит.
Потому что нужно указывать XPATH путь, а не имя тега. Или вы думаете я просто так там написал './/ChargeInfo'?
1
1 / 1 / 0
Регистрация: 17.08.2015
Сообщений: 16
30.07.2019, 14:57  [ТС]
Сорри. Я думал, что это тоже из-за пространства имен так надо делать.
Сейчас конечно все находит. Спасибо за пояснение.

Но как теперь найти номер тега, чтобы передать этот аргумент для insert?
0
Эксперт Python
5438 / 3859 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
30.07.2019, 18:30
Лучший ответ Сообщение было отмечено Urusmab как решение

Решение

Цитата Сообщение от Urusmab Посмотреть сообщение
Но как теперь найти номер тега, чтобы передать этот аргумент для insert?
Взять и подсчитать. Можно глазами, можно циклом.

После TAPCurrency:
Python
1
2
3
4
for i, elem in enumerate(ChargeInfo[0].findall('*')):
    if elem.tag == "TAPCurrency":
        ChargeInfo[0].insert(i+1,TotalNoOfCalls)
        break
Перед TotalNetCharge:
Python
1
2
3
4
for i, elem in enumerate(ChargeInfo[0].findall('*')):
    if elem.tag == "TotalNetCharge":
        ChargeInfo[0].insert(i,TotalNoOfCalls)
        break

В lxml все проще - есть метод addnext вместо всего этого цикла.
Поэтому изучайте lxml - она везде используется.
1
1 / 1 / 0
Регистрация: 17.08.2015
Сообщений: 16
31.07.2019, 07:54  [ТС]
Спасибо за пояснение. Я думал, что номер тега надо указать в полном виде. Типа root[0][1][1][2]. Не пришло в голову, что достаточно указать номер в рамках одного элемента.

Сейчас insert работает, но вставка идет как конкатенация к существующей строке. Это нормально? В принципе append тоже добавлял тег в существующую строку. Как-будто не хватает символа переноса строки.

XML
1
2
3
4
5
6
7
                     <ChargeInfo>
                        <TAPTxCutoffTmstp>2019-07-03T23:00:00+04:00</TAPTxCutoffTmstp>
                        <TAPAvailTmstp>2019-07-12T14:49:43+01:00</TAPAvailTmstp>
                        <TAPCurrency>XDR</TAPCurrency>
                        <TotalNoOfCalls>1000</TotalNoOfCalls><TotalNetCharge>100.275</TotalNetCharge>
                        <TotalTax>0</TotalTax>
                        <TrafficBreakdownList>
Хотя при этом файл успешно обрабатывается в сервисном ПО. Т.е. все в порядке, но выглядит необычно.

Про lxml вчера пробежался по поиску. На первый взгляд как-то все сложнее. Либо просто не до конца разобрался в примерах.
0
Эксперт Python
5438 / 3859 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
31.07.2019, 17:42
Цитата Сообщение от Urusmab Посмотреть сообщение
Сейчас insert работает, но вставка идет как конкатенация к существующей строке. Это нормально?
Это нормально. Стандарт XML не описывает форматирование: отступы и переводы строк - на усмотрение пользователя.
Цитата Сообщение от Urusmab Посмотреть сообщение
но выглядит необычно.
Как раз таки обычно.

Просто обычно продвинутые библиотеки умеют делать красивый человекочитаемый xml c отступами. Прочие - как xml.etree - нет.
А функцию indent я вам зачем в коде показывал?

Добавлено через 4 минуты
Цитата Сообщение от Urusmab Посмотреть сообщение
На первый взгляд как-то все сложнее.
Проще. Тем более, что lxml.etree мимикрирует под методы xml.etree.ElementTree.
И функциональнее, так как добавляет множество своих методов.
Поэтому встроенной xml в продакшене мало пользуются.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
31.07.2019, 17:42
Помогаю со студенческими работами здесь

Как в xml-файле найти таблицу по имени(FileName) и вставить новый TemplateList, после этого?
Всем привет! Есть такая структура xml-файла: &lt;Templates&gt; &lt;Template&gt; &lt;FileName&gt;Имя&lt;/FileName&gt; -- Имя эксель файла ...

php Serializer\Xml как убрать лишний тег в конечном xml файле
Всем привет! Понадобилось создать xml файл, который формируется с помощью сериалайзера в аннотациях @Serializer\Xml. Так вот, при...

Парсингом XML (<тег></тег> переходит в <тег/>)
Здравствуйте. У меня такая проблема. Имею исходный файл &lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt; &lt;root&gt; ...

Как изменять слово во шрифтах в определённом месте?
Я понимаю что вопрос идиотский ,но мне нужен на него ответ.Мне нужно чтоб определённое слово изменяло шрифт,скажем выделялось(желательно...

Как определить вывод элемента в определенном месте
&lt;!DOCTYPE html&gt; &lt;html lang=&quot;en&quot;&gt; &lt;head&gt; &lt;meta charset=&quot;utf-8&quot;/&gt; &lt;title&gt;index&lt;/title&gt; &lt;link type=&quot;text/css&quot;...


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru