проанализировать XML-файл в Python - PullRequest
0 голосов
/ 11 декабря 2018

Я хочу проанализировать xml-файл и создать на его основе словарь.И мне нужно использовать регулярные выражения для его вычисления.

<abc:ROW time_stamp="123">
    <name>abcd</name>
    <field1>field_value<field1>
    <field2>field_value</field2>
</abc:ROW>
<abc:ROW time_stamp="456">
    <name>abcd</name>
    <field1>field_value<field1>
    <field2>field_value</field2>
</abc:ROW>

Ожидаемый результат - список словаря с парой ключ-значение, такой как

abcd = [{
  "field1" = field_value,
  "field2" = field_value
}, {
  "field1" = field_value,
  "field2" = field_value
}] 

Кто-то, пожалуйста, помогите.

1 Ответ

0 голосов
/ 11 декабря 2018

XML лучше анализировать, используя библиотеку типа Beautiful Soup вместо регулярных выражений.Я могу дать вам идеальное решение для регулярных выражений, но я обязательно привлечу к нему отрицательные отзывы:)

Я бы посоветовал вам перейти по ссылке и ознакомиться с ней, чтобы вы не выбирали регулярные выражения, когда вам нужнодля анализа HTML / XML / Json.

Кроме того, ваш XML немного искажен, так как / отсутствует в некоторых ваших тегах полей, которые я исправил.

Вам понадобится несколькоэтот вид кода Python для анализа XML и агрегирования данных в виде списка словарей.

import re
from bs4 import BeautifulSoup

data = '''<abc:ROW time_stamp="123">
    <name>abcd</name>
    <field1>field_value11</field1>
    <field2>field_value12</field2>
</abc:ROW>
<abc:ROW time_stamp="456">
    <name>abcd</name>
    <field1>field_value21</field1>
    <field2>field_value22</field2>
</abc:ROW>'''


abcd = []
soup = BeautifulSoup(data)

for abcTag in soup.find_all('abc:row'):
 dict = {}
 dict['field1'] = abcTag.field1.get_text()
 dict['field2'] = abcTag.field2.get_text()
 abcd.append(dict)

print(abcd)

Который печатает,

[{'field1': 'field_value11', 'field2': 'field_value12'}, {'field1': 'field_value21', 'field2': 'field_value22'}]

Надеюсь, это поможет, и дайте мне знать для любых запросов.

Редактировать: Решение с использованием чистого регулярного выражения в соответствии со специальным запросом OP

Существует два (и может быть несколько) <abc:ROW тега, поэтому вы можете использовать это регулярное выражение

(?s)<abc.*?</abc:ROW>

для сопоставления текста в тегах, а затем итерации сопоставленного текста с использованием цикла for и последующего применения этого регулярного выражения,

<field1>(.*?)</field1>\s*<field2>(.*?)</field2>

для захвата field1 значения тега и field2 значение тега и сохраните их в словаре, и объявлениеd из словаря в список abcd.

Вот код Python, чтобы дать вам идею,

import re

data = '''<abc:ROW time_stamp="123">
    <name>abcd</name>
    <field1>field_value11</field1>
    <field2>field_value12</field2>
</abc:ROW>
<abc:ROW time_stamp="456">
    <name>abcd</name>
    <field1>field_value21</field1>
    <field2>field_value22</field2>
</abc:ROW>'''


abcd = []

for abcTag in re.findall(r'(?s)<abc.*?</abc:ROW>',data):
 dict = {}
 match = re.search(r'<field1>(.*?)</field1>\s*<field2>(.*?)</field2>', abcTag)
 dict['field1'] = match.group(1)
 dict['field2'] = match.group(2)
 abcd.append(dict)

print(abcd)

, который печатает следующий вывод, как вы ожидали,

[{'field1': 'field_value11', 'field2': 'field_value12'}, {'field1': 'field_value21', 'field2': 'field_value22'}]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...