@greatazazan

Парсинг XML-файлов скриптом. Нужно вывести нужную информацию в одну строку, каким путём это проще сделать?

Доброго дня. Нужно спарсить данные с xml-ек, желательно скриптом, файлов много.
Каким образом я могу следующий формат:
<fireparams>
    <fire>
      <param name="extra_ammo" value="120" />
      <param name="ammo_type" value="bullet_ar" />
      <param name="bullet_chamber" value="1" />
      <param name="helper_tp" value="weapon_term" />
      <param name="helper_fp" value="weapon_term" />
      <param name="nearmiss_signal" value="OnNearMiss" />
    </fire>
</fireparams>

спарсить быстро в формат типа:
extra_ammo=120|ammo_type=bullet_ar|bullet_chamber=1 и т. д.?

Т.е. здесь не просто значения меж открывающим и закрывающим тегом, что довольно просто спарсить, значения хранятся в value=

Буду очень благодарен.
  • Вопрос задан
  • 642 просмотра
Решения вопроса 1
hottabxp
@hottabxp
Сначала мы жили бедно, а потом нас обокрали..
Вы бы хоть язык написали. Если сможете установить Python и библиотеку BeautifulSoup, тогда это можно сделать на Python:
_path = 'xml/' # путь к папке с xml файлами

def parse_xml(filename):
	with open(_path+filename) as file:
		xml = file.read()
	soup = BeautifulSoup(xml,'html.parser')

	params = soup.select('param')
	my_list = []

	for x in params:
		my_list.append(x['name']+'='+x['value'])
	return '|'.join(my_list)

file_list = os.listdir(_path)

file = open('newfile.txt','w')
for filename in file_list:	
	file.writelines(parse_xml(filename)+'\n')
file.close()

Скрипт читает все файлы из папки xml и записывает в нужном формате в файл 'newfile.txt':
extra_ammo=120|ammo_type=bullet_ar|bullet_chamber=1|helper_tp=weapon_term|helper_fp=weapon_term|nearmiss_signal=OnNearMiss
Ответ написан
Пригласить эксперта
Ответы на вопрос 3
xotkot
@xotkot
хорошо есть и хорошо весьма
можно сделать в лоб:
$ cat file.xml | awk -F'=|"' '/=/{print $3"="$6}' | tr '\n' '|' | sed 's/.$//'

но тут могут встретиться разные нюансы в зависимости от xml файла

лучше воспользоваться утилитой jq, точнее yq(xq) которая переводит xml в понятный для jq json-формат
$ cat file.xml | xq -r '.fireparams.fire.param[] | "\(."@name")=\(."@value")"' | tr '\n' '|' | sed 's/.$//'
Ответ написан
Комментировать
fox_12
@fox_12
Расставляю биты, управляю заряженными частицами
На python стандартными библиотеками:
data = '''<fireparams>
    <fire>
      <param name="extra_ammo" value="120" />
      <param name="ammo_type" value="bullet_ar" />
      <param name="bullet_chamber" value="1" />
      <param name="helper_tp" value="weapon_term" />
      <param name="helper_fp" value="weapon_term" />
      <param name="nearmiss_signal" value="OnNearMiss" />
    </fire>
</fireparams>'''

import xml.etree.ElementTree as ET

print('|'.join([f"{x.get('name')}={x.get('value')}" for x in ET.fromstring(data)[0]]))

extra_ammo=120|ammo_type=bullet_ar|bullet_chamber=1|helper_tp=weapon_term|helper_fp=weapon_term|nearmiss_signal=OnNearMiss
Ответ написан
Комментировать
@nozitiv4ik
Такое даже регулярными выражениями в notepad++ можно сделать:
1. Правка > Операции с пробелами > Убрать начальные и замыкающие пробелы
2. Убираем <fireparams> и <fire>:
Найти:
<fireparams>\r\n<fire>\r\n|</fire>\r\n</fireparams>\r\n

Заменить (обязательно ставим галочку на регулярные выражения):
(ничего)

3. Заменяем параметры:
Найти:
<param name="(.*)" value="(.*)" />\r\n

Заменить:
\1=\2|
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы